2

我正在使用“添加”和“设置”将列表作为字典键的值输入。问题是,我的字典键是一个字符串。所以,我不能使用“附加”将列表作为值。因此,我使用“add”和“set”来附加值。但他们不允许列表中有重复项。如何更改我的代码以允许重复?我的部分代码如下:

if myKey in myDict.keys():
    myDict[myKey].add(value)
else:  
    myDict[mykey] = set([value])  

在这里, value 是一个浮点数。

例如,如果 myKey 是“abcd”并且它的值列表是 [1.5,2.5,3.5,1.5],通过使用我上面的代码,我只能得到 ['abcd': 1.5,2.5,3.5]。如何在不使用追加的情况下更改代码以允许重复值?提前致谢。

4

3 回答 3

4

我的字典键是一个字符串。所以,我不能使用“附加”将列表作为值

事实并非如此。您可以将字符串作为键,将列表作为值:

myDict = {}
myDict.setdefault(myKey, []).append(value)

第二个参数myDict.setdefault(myKey, [])是默认值。如果myKey不在 中myDict,则返回默认值。(这里是文档的链接。)

或者,您可以使用collections.defaultdict

import collections
myDict = collections.defaultdict(list)
myDict[myKey].append(value)

与常规的不同dict,如果myDict是 a defaultdictthen myDict[anyKey]将为不在的任何键返回一个空列表myDict


于 2013-07-10T21:29:02.800 回答
1

您不能将重复值存储在set. 这就是重点。

您似乎也期望set保持秩序。它不这样做。它似乎适用于小情况,但如果你编写依赖于它的代码,它就会崩溃。

那么,什么样的类型有点像set,但允许重复值并保留顺序?list.

键类型与您可以拥有的值类型没有任何关系。即使确实如此,也很难看出为什么set并且list会采取不同的行动。在这种情况下。

所以:

if myKey in myDict.keys():
    myDict[myKey].append(value)
else:  
    myDict[mykey] = [value]

请注意,您可以使用以下任一方式简化整个事情setdefault

myDict.setdefault(myKey, []).append(value)

… 或使用collections.defaultdict:

myDict = defaultdict(list)
# ...
myDict[myKey].append(value)
于 2013-07-10T21:29:49.370 回答
1

将 adefaultdictlistdefault_factory一起使用

from collections import defaultdict
d = defaultdict(list)
for x in [1.5,2.5,3.5,1.5]:
    d['abcd'].append(x)

print d
defaultdict(<type 'list'>, {'abcd': [1.5, 2.5, 3.5, 1.5]})
于 2013-07-10T21:31:20.967 回答