【问题标题】:Comparing two lists and inserting Nulls where necessary比较两个列表并在必要时插入 Null
【发布时间】:2015-09-11 12:58:09
【问题描述】:

我有两个列表,一个主列表和该列表的一个子集,我想将主列表与子集进行比较,然后在 python 中缺少子集的地方插入空值。

需要在管道之后分隔值,但在比较两个列表时并不重要。

主列表

["A", "B", "C", "D", "E", "F"]

子集

["A|1" , "D|41", "F|34", "F|54"]

期望的结果

["A|1","NULL","NULL","D|41","NULL","F|34", "F|54"]

欢迎任何帮助。

【问题讨论】:

  • @VigneshKalai 是的,它是一个角色

标签: python list comparison


【解决方案1】:

假设:

list1 = ['A', 'B', 'C', 'D', 'E', 'F']
list2 = ['A|1' , 'D|41', 'F|34']

创建要比较的列表

comp_list2 = [ x.split('|')[0] for x in list2 ]

选择常用值

result = [ list2[comp_list2.index(x)] if x in comp_list2 else "NULL" for x in list1 ] # Better Replace "NULL" with None

print result

['A|1', 'NULL', 'NULL', 'D|41', 'NULL', 'F|34']

【讨论】:

  • comp_list2 = [ x[0] for x in list2 ]
  • @saulspatz 当 x 为 something like "AB" 时它不会起作用,我们必须比给出的样本多考虑
  • @YOBA 非常好的答案,它确实有效,但你能为我解释一下吗result = [ list2[comp_list2.index(x)] if x in comp_list2 else "NULL" for x in list1 ]
  • @Vigneshi Kalaia 点已被占用。
  • @VigneshKalai 完全正确,这就是我使用 split 的原因。
【解决方案2】:

如果您不想创建额外的列表,您可以使用此方法,但投票最多的答案会更快

代码:

inp_check=["A|1" , "D|41", "F|34"]
inp_master=["A","B", "C", "D", "E", "F"]
print [next((value2 for value2 in inp_check if value in value2 ) ,"null") for value in inp_master]

输出:

['A|1', 'null', 'null', 'D|41', 'null', 'F|34']

编辑:

代码1:

inp_check=["A|1" , "D|41", "F|34", 'F|56']
inp_master=["A","B", "C", "D", "E", "F"]
output=[]
for value in inp_master:
    check=0
    for check_value in inp_check:
        if value in check_value:
            check=1
            output.append(check_value)
    if check ==0:
        output.append("NULL")
print output

输出:

['A|1', 'NULL', 'NULL', 'D|41', 'NULL', 'F|34', 'F|56']

【讨论】:

  • inp_check 不存在我尝试在更改后运行代码,但它没有插入任何空值
  • inp_check=["A|1" , "D|41", "F|34", 'F|56'] inp_master=["A","B", "C", "D", "E", "F"] print [next((value2 for value2 in inp_check if value in value2 ) ,"null") for value in inp_master] 在这个例子中,如果我添加另一个 F 值。它没有在最终列表中被选中..您知道任何补救措施吗?
  • inp_check=["A|1" , "D|41", "F|34", 'F|56'] inp_master=["A","B", "C", "D", "E", "F"] print [next((value2 for value2 in inp_check if value in value2 ) ,"null") for value in inp_master] 输出 C:\Python27\python.exe C:/Users/C2043027/PycharmProjects/PIM/testiter.py ['A|1', 'null', 'null', 'D|41', 'null', 'F|34'] 缺少 56 的 F 值。
  • @BasicHorizo​​n 在这种情况下的预期输出是什么
  • ['A|1', 'null', 'null', 'D|41', 'null', 'F|34', 'F|56']你觉得这可能吗
【解决方案3】:

这是一个实际执行问题中所问内容并将值插入到原始列表中而不是创建新列表的方法。

master = ["A", "B", "C", "D", "E", "F", "G"]
sub = ["A|1" , "D|41", "F|34"]

for i, elem in enumerate(master):
     try:
         next_ = sub[i]
     except IndexError:
         next_ = ''
     if not next_.startswith(elem):
         sub.insert(i, 'Null')

【讨论】:

  • 这个答案的唯一问题是它在开头插入了所有空值。不是我相信的顺序
  • 不,它会在列表中的i 位置插入'Null'
  • 你是对的,但由于某种原因,当我使用我的实际数据而不是样本数据时,所有的空值都会回到开头。
  • @BasicHorizo​​n 你是对的,数据需要事先排序,我会稍后更新答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-01-08
相关资源
最近更新 更多