簡體   English   中英

比較Python列表中的元素

[英]Compare elements inside list of lists in Python

我正在嘗試通過刪除現有列表列表中具有重復值的行來創建列表的新列表。

fir = [['a35',1],['a35',2],['3r',6],['3r',8],[5,9]]
sec = []

for row in fir:
    if sec is None:
        sec.append(row)
    elif row[0] not in sec:
        sec.append(row)

print(sec)

預期輸出:[['a35',1],['3r',6],[5,9]]

實際輸出:[['a35',1],['a35',2],['3r',6],['3r',8],[5,9]]

我想創建一個列表列表,其中row [0]的值是唯一的並且不重復(例如,帶有“ a35”的行應僅包含一次)

我該如何實現?

您的當前代碼失敗,因為在第一次迭代后, sec如下所示: [['a35',1]] 在第二次迭代中, row ['a35',2]值無法從sec找到,因此將其附加到該行。

您可以使用groupby根據第一個元素對內部列表進行分組。 groupby返回(key, it)元組的可迭代,其中key是第二個參數返回的值, it是組中元素的可迭代:

>>> from itertools import groupby
>>> fir = [['a35',1],['a35',2],['3r',6],['3r',8],[5,9]]
>>> [next(g) for _, g in groupby(fir, lambda x: x[0])]
[['a35', 1], ['3r', 6], [5, 9]]

請注意,以上假設具有相同第一個元素的列表在seq彼此相鄰。 如果不是這種情況,則可以在將seq傳遞給groupby之前對其進行排序,但這僅在第一個元素可用作鍵時才有效。 對於您的數據,情況並非如此,因為存在無法在Python 3上進行比較的字符串和整數。您可以將這些項目收集到OrderedDict

from collections import OrderedDict
fir = [['a35',1],['a35',2],['3r',6],['3r',8],[5,9],['a35',7]]

d = OrderedDict()
for x in fir:
    d.setdefault(*x)

print([list(x) for x in d.items()])

輸出:

[['a35', 1], ['3r', 6], [5, 9]]

您可以簡單地保存唯一值(元組中的第一個數據),這是錯誤的,因為您將第一個元組與所有數據進行了比較(將'a35'與['a35',1]比較)

fir = [['a35',1],['a35',2],['3r',6],['3r',8],[5,9]]
sec = []

index = []
for f in fir:
    if not f[0] in index:
        index.append(f[0])
        sec.append(f)

print(sec)

使用列表理解來實現此目的:

sec=[i for i in fir if i[0] not in [fir[idx][0] for idx in xrange(0,fir.index(i))]]

這將從fir選擇每個項目,並將該項目的第一個元素與從索引0到該項目的索引的所有項目進行比較。

由於內部列表中只有兩項,而且您不想重復,

字典對於您的情況而言將是理想的數據結構。

我認為,當您循環冷杉時,您應該添加一個列表以記錄您在秒中輸入的密鑰。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM