繁体   English   中英

Python - 检查列表列表是否包含特定列表项

[英]Python - Check if list of lists contains a specific list item

我有一个包含其他列表的列表,我需要检查同一列表列表中的给定列表项是否在属于下一个列表列表的下一个项目列表中,如本例所示:

lstOflsts = [[1,3],[2,6],[8,10],[15,18]]

desired output : 检查[1, 3][1]是否在[2, 6]中; 如果为真,则[1, 3][2, 6]将被替换为[1, 6]

lsts = []
for idx, lst in enumerate(lstOflst):
    if lst[1] in lstOflsts[idx+1]:
        lsts.append([lst[0], lstOflsts[idx+1][1]])
    else:
        lsts.append(lst)

你能帮我看看怎么做吗? (我在上面代码的第 2 行出现错误)

假设列表是有序的,并且假设它们只包含 2 个元素,这些元素也是有序的,并且假设间隔从不重叠——它们要么是分离的,要么是相邻的,那么这是一个简单的解决方案:

lists = [[1, 3], [2, 8], [8, 10], [15, 18]]

result = [lists[0]]
for lst in lists[1:]:
    if result[-1][1] == lst[0]:
        result[-1][1] = lst[1]
    else:
        result.append(lst)

print(result)

结果:

[[1, 3], [2, 10], [15, 18]]

注意:我给了它一些东西来代替。

逻辑:

  • 用原始列表的第一个元素初始化结果
  • 对于原始文件中的每个下一个元素,检查结果的最后一个元素是否与下一个元素的开头具有相同的结尾
  • 如果是,只需用下一个元素的末尾更新最后一个元素
  • 否则,将元素添加到末尾
  • 移动到下一个元素直到完成

避免索引错误

在您提供的代码中,到达lstOflsts[idx+1]时可能会提示index out of range错误。 为避免这种情况,我建议使用以下代码:

lsts = []
for idx in range(len(lstOflsts) - 1):
  if lstOflsts[idx][1] in lstOflsts[idx+1]:
    lsts.append([lstOflsts[idx][0], lstOflsts[idx+1][1]])
  else:
    lsts.append(lstOflsts[idx])

范围参数为len(lstOflsts) - 1lstOflsts的最后一个元素将不会在 for 循环中处理。 所有其他修改都是根据这个进行的。

更换

1.如果不想处理已经处理过的元素。 现在,在 for 循环的每次迭代中,您处理索引idx的元素。 如果满足条件,则必须替换相应索引idxidx + 1的元素。 一旦被替换(添加到新列表lsts ),在下一次迭代中,您不想处理您刚刚处理的这些元素。 在这种情况下,您将不得不“跳过”一次迭代。 这意味着故意增加 for 循环idx变量:

lsts = []
for idx in range(len(lstOflsts) - 1):
  if lstOflsts[idx][1] in lstOflsts[idx+1]:
    for two in range(2): #repeat code twice
        lsts.append([lstOflsts[idx][0], lstOflsts[idx+1][1]])
    idx += 1 #<--- !
  else:
    lsts.append(lstOflsts[idx])

2.如果要处理已经处理过的元素。 如果您确实想要处理已经被替换的元素,则更有可能您必须使用一个列表列表。 如果您想保留原始列表lstOflsts ,请复制一份:

from copy import deepcopy
lsts = deepcopy(lstOflsts) #do this only if you want to preserve the original list lstOflsts

for idx in range(len(lsts) - 1):
  if lsts[idx][1] in lsts[idx+1]:
    lsts[idx] = list[idx+1] = [lsts[idx][0], lsts[idx+1][1]
  else:
    pass

在这里,您只是在替换列表中的值。 这使您能够以一种简单的方式跟踪更改。

边注

关于深度复制导入,这个 function 是唯一一个在复制列表时真正对我有用的。 但是可能还有其他更适合您的情况。

希望我能帮上忙。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM