Python字典或替代

时间:2011-12-29 11:31:33

标签: python dictionary

例如,

if dict['sample']:
    //append values to dict['sample']
else:
    // assign new key to the python dictionary

如果dict ['sample']为空,Python将抛出错误。有谁知道更好的方法来检查这个?

我想要的就是这样,我会有数据列表,比方说a,a,b,c,g,g,g,g,g。

所以,我希望python字典将两个a,a的值附加到dict ['a'],并将g,g,g,g,g附加到dict ['g'],所以其余的作为dict [ 'b']等将执行for循环以循环a,a,b,c,g,g,g,g,g的数据。

我希望我的问题清楚明了。任何的想法?最好是,如果Python的字典有办法检查现有密钥。

修改

归功于@Paul McGuire。根据@Paul McGuire的回答,我已经找到了我想要的确切解决方案。如下图所示:

from collections import defaultdict

class Test:
   def __init__(self, a,b):
       self.a=a
       self.b=b

data = []
data.append(Test(a=4,b=6))
data.append(Test(a=1,b=2))
data.append(Test(a=1,b=3))
data.append(Test(a=2,b=2))
data.append(Test(a=3,b=2))
data.append(Test(a=4,b=5))
data.append(Test(a=4,b=2))
data.append(Test(a=1,b=2))
data.append(Test(a=5,b=9))
data.append(Test(a=4,b=7))

dd = defaultdict(list)
for c in data:
    dd[c.a].append(c.b)
print dd

7 个答案:

答案 0 :(得分:13)

“如果键入dict”或“dict.get”或“dict.setdefault”的旧方法都应该被搁置以支持现在的标准defaultdict

data = "aabcggggg"

from collections import defaultdict
dd = defaultdict(list)
for c in data:
    dd[c].append(c)
print dd

defaultdict负责检查密钥是否存在,您的代码所要做的就是1)为defaultdict定义一个工厂函数或类,用于初始化一个新的密钥条目(在这种情况下,{{1} }),和2)定义如何处理每个键(defaultdict(list))。干净,简单,没有杂乱。

在您的特定示例中,您实际上可以使用dd[c].append(c),因为字母组对于每个分组值都是连续的。 itertools.groupby返回元组的迭代器,每个元组包含当前键值和匹配值的迭代器。下面的代码通过将每个元组的list-of-values-iterator转换为实际列表(在groupby中),并将key-valuelist元组序列传递给dict构造函数来工作。

list(v)

打印:

from itertools import groupby
print dict((k,list(v)) for k,v in groupby(data))

答案 1 :(得分:5)

my_dict = {}
my_dict.setdefault('sample', []).append(value)

'setdefault'方法的第二个参数表示如果给定的密钥不存在,应该是什么初始值

答案 2 :(得分:4)

如果我理解你的价值观是清单。

if 'sample' in mydict:
    pass #whatever  
else: 
    mydict['sample'] = [] 

您想要做的是以下内容:

A = ['a','a','b','b','b','c','c','c']

myDict = {}
for i in A:
    if i not in myDict: 
        myDict[i] = []
    myDict[i].append(i) 
print myDict

答案 3 :(得分:2)

每个dict键都应包含一个列表。我是对的吗?

d = dict()
try:
    d['sample'].append(new_data)
except KeyError:
    d['sample'] = [new_data]

我相信这会奏效。顺便说一句,你不应该使用名称dict作为dictonary。 dict已经被用作函数。

EDIT1:

我不确定我明白你想做什么。我也不知道我的解决方案是否是最好的解决方案。但这是你想要做的吗?看起来有点奇怪?或者你想要计算每个字母出现的次数?

# Create a list named l.
l = ['a', 'a', 'b', 'c', 'g', 'g', 'g', 'g','g']

# Create dictionary named d.
d = dict()

for i in l:
    try:
        d[i].append(i)
    except KeyError:
        d[i] = [i]

答案 4 :(得分:0)

如果您正在使用一些非常古老的python:

if not myDict.has_key(key):
    myDict[key]=[val]
else:
    myDict[key].append(val)

最近,不推荐使用has_key,而选择key in dict 所以现在,它将是:

if not key in myDict:
    myDict[key]=[val]
else:
    myDict[key].append(val)

答案 5 :(得分:0)

@ pic应该归功于@Niclas Nilsson,尽管他发布的解决方案并没有真正符合我的要求,但它确实帮助我找到了我想要的最简单的解决方案。

尽管如此,我还是感谢大家的帮助,以获得额外的知识和解决方案。非常感谢。

以下以最简单的方式实现了我想要的,没有额外的库导入等:

r = {}

try:
    if r['new_data']:
       r['new_data'] = 'appending'
except KeyError:
    r['new_data'] = 'new value'

print r['new_data']

答案 6 :(得分:0)

我最想要的确切解决方案如下所示。归功于@Paul McGuire

from collections import defaultdict

class Test:
   def __init__(self, a,b):
       self.a=a
       self.b=b

data = []
data.append(Test(a=4,b=6))
data.append(Test(a=1,b=2))
data.append(Test(a=1,b=3))
data.append(Test(a=2,b=2))
data.append(Test(a=3,b=2))
data.append(Test(a=4,b=5))
data.append(Test(a=4,b=2))
data.append(Test(a=1,b=2))
data.append(Test(a=5,b=9))
data.append(Test(a=4,b=7))

dd = defaultdict(list)
for c in data:
    dd[c.a].append(c.b)
print dd