如何在循环内的字典中的键中添加值?

时间:2014-12-04 21:01:07

标签: python list dictionary

我有以下列表:

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中..

6 个答案:

答案 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)

仅使用dictlist的简单解决方案:

>>> 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']}