python中一个键的多个值

2024-10-02 12:30:30 发布

您现在位置:Python中文网/ 问答频道 /正文

所以我的主要目标很简单,我希望在使用一个键时返回多个值。但是我有错误和混乱的行为。我是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是对象(元素)的单独索引。对于我当前的问题,我将获取这些元素的列表(这是前面提到的列表),并根据我的文件(前面也提到过)将它们分组为更小的组。为什么我认为这不重要,列表本质上是一个整数的计数。。。它会怎么弄乱我的代码?


Tags: 文件对象方法代码inself列表def
3条回答
from itertools import izip
from collections import defaultdict

dd = defaultdict(list)
with open('filename.txt') as fin:
    for idx, line in izip(my_list, fin):
        num = int(line)
        defaultdict[num].append(idx)

这将创建一个具有默认列表类型的defaultdict,因此您可以不使用setdefault而附加。然后从文件中读取my_list的每个元素和相应的行,将该行转换为整数,然后将相应的索引添加到组(由num表示)。

问题的根源在于:

d[groupIndex] = list[i]

换句话说,当一个键不在字典中时,可以在该键下添加一个单值Element对象)。下次看到该键时,尝试附加到该值。但不能附加到单个值。您需要一个容器类型(如列表)来追加。Python不会神奇地将Element对象变成列表!

解决办法很简单。如果您希望字典的值是列表,那么就这样做。添加第一个项时,附加一个元素列表:

d[groupIndex] = [list[i]]

或者,可以从原始列表中提取一个条目片段。这已经是一个列表了。

d[groupIndex] = list[i:i+1]

现在字典的值总是列表,您可以毫无错误地将第二个值和后续值附加到它们。

正如ecatmur所指出的,您可以使用d.setdefault(groupIndex, []).append(list[i])进一步简化这个过程(消除if语句)。如果键不存在,则该值将被视为空列表,您只需始终追加新项。您也可以使用collections.defaultdict(list)

只是使用

d.setdefault(groupIndex, []).append(list[i])

这将检查groupIndex是否在d中,因此您不需要if groupIndex in d:行。

相关问题 更多 >

    热门问题