Python:比较列表并在公共字段中合并
我有以下两个清单:Python:比较列表并在公共字段中合并,python,list,Python,List,我有以下两个清单: ISO3166_CountryCodes_NO = [["NO","Norge"],["SE","Sverige"],["GR","Hellas"]] ISO3166_CountryCodes_EN = [["NO","Norway"],["SE","Sweden"],["GR","Greece"]] 正如您所看到的,国家代码总是相同的,但国家名称在不同的翻译中有所不同 如何创建这样的列表: ISO3166_CountryCodes = [["NO","Norge","No
ISO3166_CountryCodes_NO = [["NO","Norge"],["SE","Sverige"],["GR","Hellas"]]
ISO3166_CountryCodes_EN = [["NO","Norway"],["SE","Sweden"],["GR","Greece"]]
正如您所看到的,国家代码总是相同的,但国家名称在不同的翻译中有所不同
如何创建这样的列表:
ISO3166_CountryCodes = [["NO","Norge","Norway"],["SE","Sverige","Sweden"],["GR","Hellas","Greece"]]
我可以在第一个列表中使用for循环,对于每个元素,我可以搜索第二个元素,以找到常见的国家代码。然后将翻译添加到新列表中,但我觉得这种方式有点笨拙
有没有更好的方法在Python中实现这一点?例如,在我比较熟悉的Perl中,我会使用一个哈希表。类似这样的内容,使用unique_everseen from and: 或者:您可以使用from itertools,与operator.itemgetter结合使用: 或使用,这是dict的一个子类,并维护秩序:
In [47]: from collections import OrderedDict
In [48]: dic=OrderedDict()
In [49]: for x in lis1:
....: dic.setdefault(x[0],[]).append(x[1])
....:
In [50]: for x in lis2:
dic.setdefault(x[0],[]).append(x[1])
....:
In [51]: dic
Out[51]: OrderedDict([('NO', ['Norge', 'Norway']), ('SE', ['Sverige', 'Sweden']), ('GR', ['Hellas', 'Greece'])])
In [52]: [[x]+y for x,y in dic.items()]
Out[52]:
[['NO', 'Norge', 'Norway'],
['SE', 'Sverige', 'Sweden'],
['GR', 'Hellas', 'Greece']]
#or directly access the names using the short-name
In [53]: dic['NO']
Out[53]: ['Norge', 'Norway']
In [54]: dic['GR']
Out[54]: ['Hellas', 'Greece']
类似于此,使用从和中看到的独特功能: 或者:您可以使用from itertools,与operator.itemgetter结合使用: 或使用,这是dict的一个子类,并维护秩序:
In [47]: from collections import OrderedDict
In [48]: dic=OrderedDict()
In [49]: for x in lis1:
....: dic.setdefault(x[0],[]).append(x[1])
....:
In [50]: for x in lis2:
dic.setdefault(x[0],[]).append(x[1])
....:
In [51]: dic
Out[51]: OrderedDict([('NO', ['Norge', 'Norway']), ('SE', ['Sverige', 'Sweden']), ('GR', ['Hellas', 'Greece'])])
In [52]: [[x]+y for x,y in dic.items()]
Out[52]:
[['NO', 'Norge', 'Norway'],
['SE', 'Sverige', 'Sweden'],
['GR', 'Hellas', 'Greece']]
#or directly access the names using the short-name
In [53]: dic['NO']
Out[53]: ['Norge', 'Norway']
In [54]: dic['GR']
Out[54]: ['Hellas', 'Greece']
您可以使用列表理解:
>>> [[s]+
[n for (c,n) in ISO3166_CountryCodes_NO if c==s]+
[n for (c,n) in ISO3166_CountryCodes_EN if c==s]
for s in set([c for (c,n) in ISO3166_CountryCodes_NO] +
[c for (c,n) in ISO3166_CountryCodes_EN])]
[['GR', 'Hellas', 'Greece'], ['SE', 'Sverige', 'Sweden'], ['NO', 'Norge', 'Norway']]
您可以使用列表理解:
>>> [[s]+
[n for (c,n) in ISO3166_CountryCodes_NO if c==s]+
[n for (c,n) in ISO3166_CountryCodes_EN if c==s]
for s in set([c for (c,n) in ISO3166_CountryCodes_NO] +
[c for (c,n) in ISO3166_CountryCodes_EN])]
[['GR', 'Hellas', 'Greece'], ['SE', 'Sverige', 'Sweden'], ['NO', 'Norge', 'Norway']]
在python中,字典是一个哈希表。首先,创建两个词典:
NO_dict = {x[0]: x[1] for x in ISO3166_CountryCodes_NO}
EN_dict = {x[0]: x[1] for x in ISO3166_CountryCodes_EN}
这给了你:
{'GR': 'Hellas', 'NO': 'Norge', 'SE': 'Sverige'}
{'GR': 'Greece', 'NO': 'Norway', 'SE': 'Sweden'}
然后,您可以创建如下列表:
final_list = [[k, NO_dict[k], EN_dict[k]] for k in NO_dict]
给你:
[['GR', 'Hellas', 'Greece'],
['SE', 'Sverige', 'Sweden'],
['NO', 'Norge', 'Norway']]
稍后,您可能会发现将数据保存在具有元组中存储的名称的字典中更容易,例如:
final_dict = {k:(NO_dict[k], EN_dict[k]) for k in NO_dict}
因此,您可以使用缩写作为键获取项目,例如,final_dict['NO']将生成'Norge','norwe'
编辑:OrderedDict
如果python>=2.7,并且您关心顺序,那么仍然可以使用OrderedDict使用字典,例如:
from collections import OrderedDict
# A list of lists can be used as input for an OrderedDict, so don't need to loop
NO_dict = OrderedDict(ISO3166_CountryCodes_NO)
EN_dict = OrderedDict(ISO3166_CountryCodes_EN)
# Assumes you want the result in the same order as the Norwegian list
# Iterate over the English list if it has a preferred order
final_dict = OrderedDict([(k, (NO_dict[k], EN_dict[k])) for k in NO_dict])
另一个实现请参见AshwiniChaudhary在python中的回答,字典是一个哈希表。首先,创建两个词典:
NO_dict = {x[0]: x[1] for x in ISO3166_CountryCodes_NO}
EN_dict = {x[0]: x[1] for x in ISO3166_CountryCodes_EN}
这给了你:
{'GR': 'Hellas', 'NO': 'Norge', 'SE': 'Sverige'}
{'GR': 'Greece', 'NO': 'Norway', 'SE': 'Sweden'}
然后,您可以创建如下列表:
final_list = [[k, NO_dict[k], EN_dict[k]] for k in NO_dict]
给你:
[['GR', 'Hellas', 'Greece'],
['SE', 'Sverige', 'Sweden'],
['NO', 'Norge', 'Norway']]
稍后,您可能会发现将数据保存在具有元组中存储的名称的字典中更容易,例如:
final_dict = {k:(NO_dict[k], EN_dict[k]) for k in NO_dict}
因此,您可以使用缩写作为键获取项目,例如,final_dict['NO']将生成'Norge','norwe'
编辑:OrderedDict
如果python>=2.7,并且您关心顺序,那么仍然可以使用OrderedDict使用字典,例如:
from collections import OrderedDict
# A list of lists can be used as input for an OrderedDict, so don't need to loop
NO_dict = OrderedDict(ISO3166_CountryCodes_NO)
EN_dict = OrderedDict(ISO3166_CountryCodes_EN)
# Assumes you want the result in the same order as the Norwegian list
# Iterate over the English list if it has a preferred order
final_dict = OrderedDict([(k, (NO_dict[k], EN_dict[k])) for k in NO_dict])
有关另一个实现,请参见AshwiniChaudhary使用Python 3.2的回答
第一条路:
[[i[0],i[1],v[1]] for i in list1 for v in list2 if i[0]==v[0]]
第二种方式:
res=[]
for i,v in list(zip(list1,list2):
tem=[i[0]]
if i[0]==v[0]: tem.extend([i[1],v[1]])
res.append(tem)
使用Python 3.2
第一条路:
[[i[0],i[1],v[1]] for i in list1 for v in list2 if i[0]==v[0]]
第二种方式:
res=[]
for i,v in list(zip(list1,list2):
tem=[i[0]]
if i[0]==v[0]: tem.extend([i[1],v[1]])
res.append(tem)
请注意,当涉及到允许的输入和结果输出时,此答案与Ashwini的答案有两个区别:即使列表中国家的顺序不同,此解决方案也有效,但它自然也不会在解决方案中保留此顺序。@lazyr添加了一个解决方案,该解决方案可以保留顺序,即使列表是随机排序的。请注意,在允许的输入和结果输出方面,此答案与Ashwini的答案有两个区别:即使国家/地区在列表中有所不同,但在解决方案中自然也不会保留此顺序。@lazyr添加了一个解决方案,该解决方案可以保留顺序,即使列表是随机排序的,也可以工作。@VangelisTasoulas不客气,如果您觉得有帮助,您可以向上投票或将答案标记为接受,我认为这是表达感谢的正确方式。@Vangelistasaulas不客气,如果你觉得答案有帮助,你可以投票或将答案标记为接受,我认为这是表达感谢的正确方式。请仅对代码段使用代码格式,而不是对整个答案使用代码格式。有关更多格式选项,请参见“请仅对代码段使用代码格式,而不是对整个答案使用代码格式”。有关更多格式选项,请参见