[英]Matching and Appending
我试图弄清楚如何通过另一个列表来运行一个列表,并且每当名字匹配时,将其追加到新列表(如果存在)
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"]
到目前为止,我还没有真正能够做到,因此即使是最小的指导也将不胜感激。 谢谢。
您可以将它们转换为字典,然后使用列表理解:
dic1 = dict(list1)
dic2 = dict(list2)
list3 = [[k,dic2[k],dic1[k]] for k in dic2 if k in dic1]
如果不关心排序,则最直接的方法是将列表转换成更合适的数据结构:字典。
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'}}
如果名称是唯一的,则可以将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]
如果不是,那么您需要决定如何处理重复名称的情况。
您可以使用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:
删除if name in d:
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.