gpt4 book ai didi

python - 如何在 Python 中遍历 defaultdict(list)?

转载 作者:行者123 更新时间:2023-11-28 21:28:18 25 4
gpt4 key购买 nike

我如何在 Python 中遍历 defaultdict(list)?有没有更好的方法在 Python 中创建列表字典?我已经尝试了正常的 iter(dict) 但我遇到了错误:

>>> import para
>>> para.print_doc('./sentseg_en/essentials.txt')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "para.py", line 31, in print_doc
for para in iter(doc):
TypeError: iteration over non-sequence

主类:

import para
para.print_doc('./foo/bar/para-lines.txt')

para.pyc:

# -*- coding: utf-8 -*-
## Modified paragraph into a defaultdict(list) structure
## Original code from http://code.activestate.com/recipes/66063/
from collections import defaultdict
class Paragraphs:
import sys
reload(sys)
sys.setdefaultencoding('utf-8')
# Separator here refers to the paragraph seperator,
# the default separator is '\n'.
def __init__(self, filename, separator=None):
# Set separator if passed into object's parameter,
# else set default separator as '\n'
if separator is None:
def separator(line): return line == '\n'
elif not callable(separator):
raise TypeError, "separator argument must be callable"
self.separator = separator
# Reading lines from files into a dictionary of lists
self.doc = defaultdict(list)
paraIndex = 0
with open(filename) as readFile:
for line in readFile:
if line == separator:
paraIndex+=1
else:
self.doc[paraIndex].append(line)

# Prints out populated doc from txtfile
def print_doc(filename):
text = Paragraphs(filename)
for para in iter(text.doc):
for sent in text.doc[para]:
print "Para#%d, Sent#%d: %s" % (
para, text.doc[para].index(sent), sent)

例如./foo/bar/para-lines.txt 看起来像这样:

This is a start of a paragraph.
foo barr
bar foo
foo foo
This is the end.

This is the start of next para.
foo boo bar bar
this is the end.

主类的输出应该是这样的:

Para#1,Sent#1: This is a start of a paragraph.
Para#1,Sent#2: foo barr
Para#1,Sent#3: bar foo
Para#1,Sent#4: foo foo
Para#1,Sent#5: This is the end.

Para#2,Sent#1: This is the start of next para.
Para#2,Sent#2: foo boo bar bar
Para#2,Sent#3: this is the end.

最佳答案

线路问题

for para in iter(doc):

doc 是 Paragraph 的实例,而不是 defaultdict。您在 __init__ 方法中使用的默认字典超出范围并丢失。所以你需要做两件事:

  1. __init__方法中创建的doc保存为实例变量(例如self.doc)。

  2. 要么使 Paragraphs 本身可迭代(通过添加 __iter__ 方法),要么允许它访问创建的 doc 对象。

关于python - 如何在 Python 中遍历 defaultdict(list)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8646583/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com