簡體   English   中英

如何在Python的嵌套列表中標記匹配項

[英]How to label matching items in a nested list in Python

這里是Python的新手。

我目前有一個嵌套列表的列表。 我正在嘗試標記每個從0-25開始的子列表。 但是,如果兩個子列表相同,則它們應具有相同的標簽。

例如:

label_list = [['AH0'], ['AA1', 'K', 'S'], ['AH0', 'N', 'T'], ['AA1', 'K', 'S'], ['IH0', 'N'], ['AA1', 'K', 'S']]

輸出應為[0, 1, 2, 1, 4, 1]

因為第二,第四和第六子列表相同。 其余子列表應僅以連續的數字順序標記。 我知道我需要使用一個循環,但是我很困惑,任何人都對如何解決這個問題有任何建議? 謝謝。

您可以使用字典:

label_list = [['AH0'], ['AA1', 'K', 'S'], ['AH0', 'N', 'T'], ['AA1', 'K', 'S'], ['IH0', 'N'], ['AA1', 'K', 'S']] 
count = 0
d = {}
for i in label_list:
  if tuple(i) not in d:
    d[tuple(i)] = count
  count += 1

final_result = [d[tuple(i)] for i in label_list]

輸出:

[0, 1, 2, 1, 4, 1]

編輯:上面的解決方案假定標簽是根據唯一值的首次出現的索引生成的。 但是,如果需要一般的增量,並且要根據看到的唯一元素的數量創建標簽,則可以在for循環內移動count

if tuple(i) not in d:
  d[tuple(i)] = count
  count += 1

然后,輸出為[0, 1, 2, 1, 3, 1]

列表理解也可以使用,盡管效率不高:

c = iter(range(len(label_list)))
new_d = {tuple(a):i for i, a in reversed(list(enumerate(label_list)))}
final_result = [next(c) if a not in label_list[:i] else new_d[tuple(a)] for i, a in enumerate(label_list)]

輸出:

[0, 1, 2, 1, 3, 1]

這是一個單線,只是為了好玩:

 [dict( map( reversed, enumerate( set( map(tuple, label_list)))))[tuple(item)] for item in label_list]

不利的一面(除了難以理解之外)是,它創建字典的次數與label_list中條目的次數相同。

要解釋其工作原理,請從內而外閱讀它:

map(tuple, label_list)將tuple函數應用(或“映射”)tuple函數到label_list的每個元素,以便以后每個元素都可以用作字典中的鍵(python列表不能是字典鍵)

set( map(tuple, label_list))在label_list中創建一組所有唯一元素,這是我們需要的,因為您需要為每個唯一條目提供唯一標簽

enumerate( set( map(tuple, label_list))) enumerate是一個函數,該函數將某些列表作為輸入,並為列表的每個元素返回一個唯一的(按順序)整數。 因此,您得到的是一個像這樣的元組列表[(0,element_0),(1,element_1)...]

map( reversed, enumerate( set( map(tuple, label_list))))反轉上面列表的元素,以便在下一步創建字典時,元素將是鍵而不是整數。 所以我們得到[[element_0,0),(element_1,0)...]

dict( map( reversed, enumerate( set( map(tuple, label_list)))))僅獲取上一步中的元組列表,並從中創建一個字典,我們可以像訪問其他任何鍵一樣訪問它們的鍵字典(即使用dictionary[element]語法。)

該行的其余部分與其他任何列表理解一樣。 它遍歷您的原始label_list並訪問我們創建的字典以獲得與每個元素關聯的唯一編號。

暫無
暫無

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

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