如何在Python中嵌套列表中标记匹配项

p s*_*eth 0 python loops nested list

这里有点新的Python.

我目前有一个嵌套列表列表.我试图从0-25开始标记每个子列表.但是,如果两个子列表相同,则它们应具有相同的标签.

例如:

label_list = [['AH0'], ['AA1', 'K', 'S'], ['AH0', 'N', 'T'], ['AA1', 'K', 'S'], ['IH0', 'N'], ['AA1', 'K', 'S']]
Run Code Online (Sandbox Code Playgroud)

输出应该是 [0, 1, 2, 1, 4, 1]

因为第二,第四和第六个子列表是相同的.其余的子列表应该以连续的数字顺序标记.我知道我需要使用一个循环,但我很困惑,任何人都有任何建议如何处理这个?谢谢.

Aja*_*234 5

你可以使用字典:

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]
Run Code Online (Sandbox Code Playgroud)

输出:

[0, 1, 2, 1, 4, 1]
Run Code Online (Sandbox Code Playgroud)

编辑:上面的解决方案假定标签是根据第一次出现的唯一值的索引生成的.但是,如果需要一般增量,并且要根据看到的唯一元素的数量创建标签,则count可以在for循环内移动:

if tuple(i) not in d:
  d[tuple(i)] = count
  count += 1
Run Code Online (Sandbox Code Playgroud)

然后,输出是[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)]
Run Code Online (Sandbox Code Playgroud)

输出:

[0, 1, 2, 1, 3, 1]
Run Code Online (Sandbox Code Playgroud)