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说先把它们分类就可以了。