我有以下列表:
x=['a','3','4','b','1','2','c','4','5']
我如何制作以下字典:
b = {'a':[3,4],'b':[1,2],'c':[4,5]}
我尝试了以下内容:
Category = defaultdict(int)
for i in a:
if Varius.is_number(i)==False:
Category[i]=[]
keys.append(i)
else:
Category[keys(i)] = i
密钥已创建,但在插入值时出现问题。(is_number
是一个函数,用于检查列表的值是否为数字或字符串)。第一天离开MATLAB。第一天在Python中..
答案 0 :(得分:4)
这是一个实际使用defaultdict
提供的功能超过正常dict
的示例:
from collections import defaultdict
x=['a','3','4','b','1','2','c','4','5']
key='<unknown>' # needed if the first value of x is a number
category = defaultdict(list) # defaultdict with list
for i in x:
if i.isalpha():
key = i;
else:
category[key].append(i) # no need to initialize with an empty list
print category
另外:您应该为类实例使用小写名称。大写名称通常保留给类。请阅读pep8以获取样式指南。
答案 1 :(得分:4)
如果列表x
中的键/值条目均匀分布,则可以使用另一种方法来构建字典。它使用了Python的一些内置特性和功能:
>>> keys = x[::3]
>>> values = [map(int, pair) for pair in zip(x[1::3], x[2::3])]
>>> dict(zip(keys, values))
{'a': [3, 4], 'b': [1, 2], 'c': [4, 5]}
解释这里使用的是什么:
x
创建新列表:x[start:stop:step]
zip
采用两个列表并生成包含每个列表的第n个元素的元组列表map(int, pair)
将数字字符串元组转换为整数列表values
由列表理解构成 - map
函数应用于每对dict
将对列表转换为字典键/值答案 2 :(得分:2)
您可以使用itertools.groupby
:
>>> from itertools import groupby
>>> l=[list(g) for k,g in groupby(x,lambda x : x.isalpha())]
>>> p=[l[i:i+2] for i in range(0,len(l),2)]
>>> {i[0]:map(int,j) for i,j in p}
{'a': [3, 4], 'c': [4, 5], 'b': [1, 2]}
答案 3 :(得分:1)
假设您的列表的第一个位置(x
)上有一个键,而且在一封信后面会有一个数字:
from collections import defaultdict
x=['a','3','4','b','1','2','c','4','5']
key = x[0]
Category = defaultdict(int)
for i in x:
if i.isalpha():
key = i;
else:
Category[key].append(i)
print Category
答案 4 :(得分:1)
使用itertools.groupby
和一些迭代器:
>>> from itertools import groupby
>>> it = (next(g) if k else map(int, g) for k, g in groupby(x, str.isalpha))
>>> {k: next(it) for k in it}
{'a': [3, 4], 'c': [4, 5], 'b': [1, 2]}
这里第一个迭代器会产生类似的东西:
>>> [next(g) if k else map(int, g) for k, g in groupby(x, str.isalpha)]
['a', [3, 4], 'b', [1, 2], 'c', [4, 5]]
现在这个迭代器交替产生键值,我们可以循环遍历这个迭代器并使用next()
>>> it = (next(g) if k else map(int, g) for k, g in groupby(x, str.isalpha))
>>> for k in it:
print k,'-->' ,next(it)
...
a --> [3, 4]
b --> [1, 2]
c --> [4, 5]
使用zip
使用此迭代器的另一种方法,但它是little hard to understand IMO:
>>> it = (next(g) if k else map(int, g) for k, g in groupby(x, str.isalpha))
>>> dict(zip(*[it]*2))
{'a': [3, 4], 'c': [4, 5], 'b': [1, 2]}
答案 5 :(得分:0)
仅使用dict
和list
的简单解决方案:
>>> category = {}
>>> for i in x:
... if i.isalpha():
... items = category[i] = []
... elif category:
... items.append(i)
...
>>> print(category)
{'c': ['4', '5'], 'a': ['3', '4'], 'b': ['1', '2']}