如何在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]

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


慕容708150
浏览 198回答 2
2回答

慕的地8271018

您可以使用字典:label_list = [['AH0'], ['AA1', 'K', 'S'], ['AH0', 'N', 'T'], ['AA1', 'K', 'S'], ['IH0', 'N'], ['AA1', 'K', 'S']] count = 0d = {}for i in label_list:  if tuple(i) not in d:    d[tuple(i)] = count  count += 1final_result = [d[tuple(i)] for i in label_list]输出:[0, 1, 2, 1, 4, 1]编辑:上面的解决方案假定标签是根据唯一值的首次出现的索引生成的。但是,如果需要一般的增量,并且要根据看到的唯一元素的数量创建标签,则count可以在for循环内移动它: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函数应用(或“映射”)元组函数到label_list的每个元素,以便以后每个元素都可以用作字典中的键(python列表不能是字典键)set( map(tuple, label_list)) 在label_list中创建一组所有唯一元素,这是我们需要的,因为您希望每个唯一条目都具有唯一标签enumerate( set( map(tuple, label_list)))枚举是一个将某些列表作为输入并为列表的每个元素返回唯一(按顺序)整数的函数。因此,您得到的是这样的元组列表[[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并访问我们创建的字典以获得与每个元素关联的唯一编号。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python