2014-12-04 93 views
5

我有以下列表:如何在循环内的字典中的键中添加值?

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.First第一天Python的..

回答

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

假设你有你的列表(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 
+0

如果你initializ每个字典值都带有一个空列表,不需要使用'defaultdict'。 – PeterE 2014-12-04 21:21:45

+0

@彼得,好点。 – syntagma 2014-12-04 21:26:03

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]} 
+0

我不认为OP希望1或3是关键。 – Kevin 2014-12-04 21:07:54

+0

@Kevin是的,我想念somthing我会更新,感谢提醒 – Kasramvd 2014-12-04 21:08:24

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变成对的列表到字典的键/值
+0

哇哇,如果价值是动态???,像'a',1,2,'b',4,5,6 ??? – Hackaholic 2014-12-04 21:16:52

+1

这只能解决OP在相关条目均匀分布的情况。我会在答案中说清楚。 – 2014-12-04 21:20:12

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

现在,由于此迭代器将交替产生键值,因此我们可以遍历此迭代器并从中获取下一项(即,e。使用的值)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]} 
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']}