簡體   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