Python 按索引和名称匹配两个列表

Python 按索引和名称匹配两个列表,python,python-2.7,list,Python,Python 2.7,List,如何将两个列表比较在一起,并创建一个输出列表,其中公共项在索引和名称中移动以匹配。主列表只生成一次,在整个脚本中保持不变 在某些情况下,更改列表将包含主列表中不存在的项,我想为这些项创建一个单独的列表 例如: main_list = ['apple', 'orange', 'banana', 'pear', 'mango', 'peach', 'strawberry'] changing_list = ['apple', 'banana', 'cucumber', 'peach', 'pear'

如何将两个列表比较在一起,并创建一个输出列表,其中公共项在索引和名称中移动以匹配。主列表只生成一次,在整个脚本中保持不变

在某些情况下,更改列表将包含主列表中不存在的项,我想为这些项创建一个单独的列表

例如:

main_list = ['apple', 'orange', 'banana', 'pear', 'mango', 'peach', 'strawberry']
changing_list = ['apple', 'banana', 'cucumber', 'peach', 'pear', 'fish']

output = ['apple', 'NA', 'banana', 'pear', 'NA', 'peach', 'NA']
added_output = ['cucumber', 'fish']
在比较之前,在每个列表上使用sorted()函数可能会有一些用处,但是,我不知道是否缺少“orange”(例如,使用NA或X)。我知道可以选择使用,
设置和“&”运算符,但是,使用该运算符并不表示索引/定位透视图(NA部分)缺少哪个项目。

假设您不关心重复项,您可以使用集合来有效地查找差异:

output=[]
main_set, changing_set = set(main_list), set(changing_list)
for i in main_list:
    output.append(i if i not in changing_set else "NA")
added_output = changing_set - main_set

可以使用集合和列表理解来执行此操作:

def ordered_intersection(main_list, changing_list):
    changing_set = set(changing_list)
    output = [x if x in changing_set else 'NA' for x in main_list]

    output_set = set(output)
    added_output = [x for x in changing_list if x not in output_set]

    return output, added_output
其工作原理如下:

>>> main_list = ['apple', 'orange', 'banana', 'pear', 'mango', 'peach', 'strawberry']
>>> changing_list = ['apple', 'banana', 'cucumber', 'peach', 'pear', 'fish']
>>> ordered_intersection(main_list, changing_list)
(['apple', 'NA', 'banana', 'pear', 'NA', 'peach', 'NA'], ['cucumber', 'fish'])
上述代码说明:

  • 首先将更改列表转换为一个集合,因为集合成员是恒定时间,而列表成员是线性时间
  • 由于我们想保持
    main\u list
    进入输出的顺序,我们必须遍历该列表中的所有元素,并检查它们是否存在于
    changing\u set
    中。这防止了每个操作的二次时间复杂性,并允许线性行为
  • 上述逻辑也适用于
    添加的\u输出

以下方法可以通过索引和名称匹配两个列表

>>> main_list = ['apple', 'orange', 'banana', 'pear','mango', 'peach', 
'strawberry']
>>> changing_list = ['apple', 'banana', 'cucumber', 'peach', 'pear', 'fish']
>>> output = []
>>> for word in main_list:
...     if word in changing_list:
...             output.append(word)
...     else:
...             output.append('NA')
...
>>> output
['apple', 'NA', 'banana', 'pear', 'NA', 'peach', 'NA']

>>> added_output = []
>>> for word in changing_list:
...     if word not in main_list:
...             added_output.append(word)
...
>>> added_output
['cucumber', 'fish']

这可能与RoadRunner的原始答案类似。这是一个O(n^2)解决方案,如果列表很长,那么非常昂贵。是的@Turn,我在发布后看到了它。您失去了与的订单sets@denov是的,你说得对。我认为这没问题,因为OP说先把它们分类就可以了。