所以我的主要目标很简单,我希望在使用一个键时返回多个值。但是我有错误和混乱的行为。我是Python新手,所以我完全希望这个问题有一个简单的原因。
我有一个对象列表,list
,它只包含对象的索引。i、 e
1
2
3
4
etc..
以及包含每个对象所属的组的文件,按相同顺序列出。文件是n行(n也是对象列表的长度)的单个值,即文件如下所示:
2
5
2
4
etc..
意思是第一个宾语属于第二组,第二个宾语属于第五组,第三个宾语属于第二组,第四个宾语属于第四组。此文件将根据我的输入文件而更改。我尝试了以下两个建议(我能找到)。
编辑:我的最终目标:拥有一个以组号为键、以组中的对象为值的字典。
我首先查看了StackOverflowappend-multiple-values-for-one-key-in-python-dictionary">question以寻求帮助,因为它非常相似,最后得到了以下代码:
def createdDict(list, file):
f = open(file, 'r')
d={}
i=0
for line in f:
groupIndex = int(line)
if groupIndex in d:
d[groupIndex].append(list[i])
else:
d[groupIndex] = list[i]
i +=1
print d
f.close()
这个错误:
AttributeError: 'Element' object has no attribute 'append'
d[groupIndex]
只是一个字典,它的键和groupIndex
也应该是一个整数。。不是我在脚本前面创建的类中的对象。(为什么会出现这个错误?)
然后,在遇到这个other question之后,我修改了代码,如下所示,因为我认为这是完成任务的另一种方法。我的代码是这样的:
def createdDict(list, file):
f = open(file, 'r')
d={}
i=0
for line in f:
groupIndex = int(line)
if groupIndex in d:
d.setdefault('groupIndex', []).append(list[i])
else:
d[groupIndex] = list[i]
i +=1
print d
f.close()
这段代码并不是以错误或我想要的结尾,而是(我相信)组中的最后一个对象。。。所以print d
给我键和放在组中的最后一个对象(而不是期望的:该组中的所有对象),然后终端随机弹出groupIndex
,然后是list
中的所有对象。
我的问题:我到底错过了什么?人们对我所链接的问题的答案进行了投票,因此他们很可能是正确的,而我很可能执行错误。我不需要对这两个过程都进行更正,但最有效的解决方法是将多个值附加到一个键上。要完成这项任务,什么样的方法最管用?
编辑2:如果这有帮助,这里是第一个方法引用错误的类。我不知道它如何将代码的任何部分定义为类的一部分。我还没有真正开发它,但我完全赞成答案,所以如果这有助于查找错误:
class Element(object):
def __init__(self, globalIndex):
self.globalIndex = globalIndex
def GetGlobalIndex (self):
return self.globalIndex
globalIndex
是对象(元素)的单独索引。对于我当前的问题,我将获取这些元素的列表(这是前面提到的列表),并根据我的文件(前面也提到过)将它们分组为更小的组。为什么我认为这不重要,列表本质上是一个整数的计数。。。它会怎么弄乱我的代码?
这将创建一个具有默认列表类型的
defaultdict
,因此您可以不使用setdefault
而附加。然后从文件中读取my_list
的每个元素和相应的行,将该行转换为整数,然后将相应的索引添加到组(由num
表示)。问题的根源在于:
换句话说,当一个键不在字典中时,可以在该键下添加一个单值(
Element
对象)。下次看到该键时,尝试附加到该值。但不能附加到单个值。您需要一个容器类型(如列表)来追加。Python不会神奇地将Element
对象变成列表!解决办法很简单。如果您希望字典的值是列表,那么就这样做。添加第一个项时,附加一个元素列表:
或者,可以从原始列表中提取一个条目片段。这已经是一个列表了。
现在字典的值总是列表,您可以毫无错误地将第二个值和后续值附加到它们。
正如ecatmur所指出的,您可以使用
d.setdefault(groupIndex, []).append(list[i])
进一步简化这个过程(消除if
语句)。如果键不存在,则该值将被视为空列表,您只需始终追加新项。您也可以使用collections.defaultdict(list)
。只是使用
这将检查
groupIndex
是否在d
中,因此您不需要if groupIndex in d:
行。相关问题 更多 >
编程相关推荐