例如,
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
答案 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已经被用作函数。
我不确定我明白你想做什么。我也不知道我的解决方案是否是最好的解决方案。但这是你想要做的吗?看起来有点奇怪?或者你想要计算每个字母出现的次数?
# 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)
尽管如此,我还是感谢大家的帮助,以获得额外的知识和解决方案。非常感谢。
以下以最简单的方式实现了我想要的,没有额外的库导入等:
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