python中的字典操作列表



我有一个以下形式的列表:

oldlist = [{'x': 1, 'y':2},{'x':2, 'y':2},{'x':1, 'y':3},{'x':1, 'y':2},{'x':3, 'y':4}]  

要转换为

final = [{'x':1,'y':[2,3,2],'count':3},{'x':2,'y':[2],'count':1},{'x':3,'y':[4],'count':1}]  

我试过了

oldlist = [{'x': {'a':1,'b':2}, 'y':2},{'x':{'a':6,'b':7}, 'y':2},{'x':{'a':1,'b':2}, 'y':3},{'x':{'a':1,'b':2}, 'y':2},{'x':{'a':10,'b':11}, 'y':4}]  
list1=[]  
list2=[]  
list3=[]  
s = set([d['x'] for d in oldlist])  
news=list(s)  
for item in oldlist:  
if item['x'] == news[0]:  
      list1.append(item['y'])  
if item['x'] == news[1]:  
      list2.append(item['y'])  
if item['x'] == news[2]:  
      list3.append(item['y'])  
final=[]  
dic1 = {'x':news[0],'y':list1,'count':len(list1)}  
dic2 = {'x':news[1],'y':list2,'count':len(list2)}  
dic3 = {'x':news[2],'y':list3,'count':len(list3)}  
final.append(dic1)  
final.append(dic2)  
final.append(dic3)  
print final

有没有更简单的方法可以做到这一点?另外,我知道x只能有三个值,所以我创建了三个变量list1,list2和list3。如果 x 可以有几个其他值,我必须找到类似的字典列表,例如 final!它也应该适用于字符串!

您可以将字典收集到defaultdict其中键是从原始字典x的,值是相关y值的列表。然后使用列表推导来生成最终结果:

from collections import defaultdict
l = [{'x':1, 'y':2},{'x':2, 'y':2},{'x':1, 'y':3},{'x':1, 'y':2},{'x':3, 'y':4}]
res = defaultdict(list)
for d in l:
    res[d['x']].append(d['y'])
final = [{'x': k, 'y': v, 'count': len(v)} for k, v in res.items()] # [{'y': [2, 3, 2], 'x': 1, 'count': 3}, {'y': [2], 'x': 2, 'count': 1}, {'y': [4], 'x': 3, 'count': 1}]
x_list = [item['x'] for item in list1]
set_value = set(x_list)
final_lst = []
for i in set_value:
   d = {}
   d['x'] = i
   d['count'] = x_list.count(i)
   d['y'] = []
   for item in list1:
       if item['x'] == d['x']:
          d['y'].append(item['y'])
   final_lst.append(d)  
print ("Final List", final_lst)

好的,我在这里使用了一个小技巧来完成这项工作,这不是最pythonic的方式,但它仍然可以得到你想要的答案。问题是索引?所以 a 将 s 更改为 t,其中 t 是一个列表并更改了代码的末尾,因为您必须将键作为字符串放在字典上,因此 x 变为"x"等等。

请参阅下面的完整代码:

lista = [{'x':1, 'y':2},{'x':2, 'y':2},{'x':1, 'y':3},{'x':1, 'y':2},{'x':3, 'y':4}]  

list1=[]
list2=[]
list3=[]
for d in lista:
    print(d)
s = set([d['x'] for d in lista])
t = []
for element in s: #turn t into a list which has the same ordering as s
    t.append(element)
for item in lista:
    if item['x'] == t[0]:
          list1.append(item['y'])
    if item['x'] == t[1]:
          list2.append(item['y'])
    if item['x'] == t[2]:
          list3.append(item['y'])
final=[]
dic1 = {'x':t[0],'y':list1,'count':len(list1)}
dic2 = {'x':t[1],'y':list2,'count':len(list2)}
dic3 = {'x':t[2],'y':list3,'count':len(list3)}
final.append(dic1)
final.append(dic2)
final.append(dic3)   
print(final)

最新更新