Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/331.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python:比较列表并在公共字段中合并_Python_List - Fatal编程技术网

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不客气,如果你觉得答案有帮助,你可以投票或将答案标记为接受,我认为这是表达感谢的正确方式。请仅对代码段使用代码格式,而不是对整个答案使用代码格式。有关更多格式选项,请参见“请仅对代码段使用代码格式,而不是对整个答案使用代码格式”。有关更多格式选项,请参见