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