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

时间:2018-01-30 03:23:22

标签: python python-2.7 list

如何将两个列表进行比较,并创建一个输出列表,其中常用项目将移位以匹配索引和名称。主列表一次制作并在整个脚本中保持不变。

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

示例:

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部分)缺少哪个项目

3 个答案:

答案 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']
相关问题