匹配和追加

时间:2015-03-24 20:40:52

标签: python python-2.7 python-3.x

我正在试图找出如何通过另一个列表运行1个列表,并且只要名字匹配,如果它存在则将其附加到新列表

list1 = [["Ryan","10"],["James","40"],["John","30"],["Jake","15"],["Adam","20"]]

list2 = [["Ryan","Canada"],["John","United States"],["Jake","Spain"]]

所以它看起来像这样。

list3 = [["Ryan","Canada","10"],["John","United States","30"],["Jake","Spain","15"]

到目前为止,我还没有真正接近,所以即使是最小的指导也会非常感激。感谢。

4 个答案:

答案 0 :(得分:1)

您可以将它们转换为词典,然后使用列表理解:

dic1 = dict(list1)
dic2 = dict(list2)
list3 = [[k,dic2[k],dic1[k]] for k in dic2 if k in dic1]

答案 1 :(得分:1)

如果排序不是问题,最直接的方法是将列表转换为更合适的数据结构:字典。

ages      = dict(list1)
countries = dict(list2)

这样可以很好地结合各种数据:

>>> {name: [ages[name], countries[name]] for name in ages.keys() & countries.keys()}
{'Ryan': ['10', 'Canada'], 'Jake': ['15', 'Spain'], 'John': ['30', 'United States']}

甚至更好,使用嵌套的词组:

>>> {name: {'age': ages[name], 'country': countries[name]} for name in ages.keys() & countries.keys()}
{'Ryan': {'country': 'Canada',        'age': '10'},
 'Jake': {'country': 'Spain',         'age': '15'},
 'John': {'country': 'United States', 'age': '30'}}

答案 2 :(得分:0)

如果名称是唯一的,您可以将list1放入字典中,然后在list2中循环添加此字典中的项目。

list1 = [["Ryan","10"],["James","40"],["John","30"],["Jake","15"],["Adam","20"]]
list2 = [["Ryan","Canada"],["John","United States"],["Jake","Spain"]]
list1_dict = dict(list1)
output = [item + [list1_dict[item[0]]] for item in list2]

如果没有,那么您需要决定如何处理重复名称的案例。

答案 3 :(得分:0)

您可以使用set和OrderedDict组合常用名称并保持顺序:

list1 = [["Ryan","10"],["James","40"],["John","30"],["Jake","15"],["Adam","20"]]

list2 = [["Ryan","Canada"],["John","United States"],["Jake","Spain"]]


from collections import OrderedDict

# get set of names from list2
names = set(name for name,_ in list2)

# create an OrderedDict using name as key and full sublist as value
# filtering out names that are not also in list2
d = OrderedDict((sub[0], sub) for sub in list1 if sub[0] in names)

for name, country in list2:
     if name in d:
         # add country from  each sublist with common name
         d[name].append(country)

print(d.values()) # list(d.values()) for python3
[['Ryan', '10', 'Canada'], ['John', '30', 'United States'], ['Jake', '15', 'Spain']]

如果list2始终具有通用名称,则可以删除if name in d: