如何将两个列表进行比较,并创建一个输出列表,其中常用项目将移位以匹配索引和名称。主列表一次制作并在整个脚本中保持不变。
在某些情况下,更改列表将包含主列表中不存在的项目,我想为这些项目创建单独的列表......
示例:
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()函数可能会有一些用处,但是,我无法理解,例如缺少“橙色”(最好是使用NA或X)。我知道使用的选项, 套装和'&'但是,使用此操作符并不表示索引/定位透视图(NA部分)缺少哪个项目
答案 0 :(得分:1)
您可以使用集合和列表推导来执行此操作:
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'])
上述代码说明:
changing_list
转换为集合,因为集合成员资格是常量时间,而不是列表成员资格,即线性时间。 main_list
的顺序保持为输出,我们必须遍历该列表中的所有元素,并检查它们是否存在于changing_set
中。这可以防止每个操作的二次时间复杂度,并允许线性行为。 added_output
。 答案 1 :(得分:0)
假设您不关心重复项,您可以使用集合来有效地找到差异:
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
答案 2 :(得分:0)
以下方法用于按索引和名称匹配两个列表
>>> 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']