2015-10-26 49 views
-1

我有这样的词典列表:在字典中删除重复和列表值追加到一个关键

[{'name': 'comet1', 'coordinates': [15., 10.12345612]}, 
{'name': 'comet2', 'coordinates': [11.45678762, 12.56789876]}, 
{'name': 'comet3', 'coordinates': [13.31512314, 14.68123912]}, 
{'name': 'comet3', 'coordinates': [10.78876782, 11.23234321]}] 

我试图删除重复的名称和相应的坐标值追加到只有一个名字。所以列表可以是类似的东西

[{'name': 'comet1', 'coordinates': [15., 10.12345612]}, 
{'name': 'comet2', 'coordinates': [11.45678762, 12.56789876]}, 
{'name': 'comet3', 'coordinates': [13.31512314, 14.68123912, 10.78876782, 11.23234321]}] 

上述数据是从外部文件获得,并重新构造成这种格式。在使用defaultdict和其他方法后,我不太确定如何实现这一点。

这是我尝试(逻辑错误是在第二个for循环。)

content = [] 
comets = {"name":comet_name, "coordinates":coordinates} 
    content.append(comets) 
new_d = {} 
for x in content: 
    for name in names: #names is a set containing all indivual comet names 
     if x["name"] == name: 
      print(x["name"]) 
      new_d = {"name":name, "coordinates": x["coordinates"].append(coordinates) 
+2

欢迎!通常情况下,如果您向我们展示解决问题的尝试,那么我们可以帮助您对它们进行微调,而不仅仅是要求我们为您提供解决方案。 StackOverflow不是代码写入服务。 –

+1

你最终可能不希望这样做,因为从'[1,2,3,4,5,6]'提取有用的坐标将比'[[1,2],[3,4]]更恼人, [5,6]]。你也应该使用元组来代替列表。 –

+1

你真的想要保持清单的结构?合作真的很糟糕。使用从名称到坐标的单个字典映射会容易得多。事实上,我能想到的唯一有效方法就是先创建单个字典,然后用它来重建列表中的字典。 – Blckknght

回答

1

我可能会使用一个defaultdict收集坐标。沿着这些方向的东西:

from collections import defaultdict 

result = defaultdict(list) 

for comet in initiallist: 
    result[comet['name']].extend(comet['coordinates']) 
    # Or for a list of tuples 
    result[comet['name']].append(tuple(comet['coordinates'])) 

这应该会产生你后面的结果(就像我可以告诉的那样)。

+1

按照Alex Hall的建议,你也可以对坐标对进行元组化。 – pcurry

+0

同意,但只限于用户需要元组。他所要求的结果明显变平了,所以我就这样做了,但我还会添加其他选项。 –

0

我打算假设您有足够的这些来处理通过源列表中的单个传递更可取。另外,你还想要字典列表。

from collections import defaultdict 


final_list = [] 
lookup_map = defaultdict(lambda : -1) 
for comet in sighting_list: 
    final_index = lookup_map[comet["name"]] 
    if final_index < 0: 
     lookup_map[comet["name"]] = len(final_list) 
     final_list.append(comet) 
    else: 
     final_list[final_index]["coordinates"].extend(comet["coordinates"]) 

这应该给你在你的comet_list中的每个彗星名称的平面列表。

相关问题