Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Python中标记嵌套列表中的匹配项_Python_List_Loops_Nested - Fatal编程技术网

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

如何在Python中标记嵌套列表中的匹配项,python,list,loops,nested,Python,List,Loops,Nested,这里对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] 因为第二、第四和第六个子列表是相同的。其余的子列表只应按连续的数字顺序进行标记。

这里对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]
[0, 1, 2, 1, 3, 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, 4, 1]
[0, 1, 2, 1, 3, 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]
[0, 1, 2, 1, 3, 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, 4, 1]
[0, 1, 2, 1, 3, 1]

这是一条单行线,只是为了好玩:

 [dict( map( reversed, enumerate( set( map(tuple, label_list)))))[tuple(item)] for item in label_list]
缺点(除了不可读之外)是它创建字典的次数与标签列表中的项目相同

要解释其工作原理,请从内到外阅读:

map(tuple,label\u list)
将tuple函数应用(或“映射”)到label\u 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)))
这将反转上面列表中的元素,以便在下一步创建字典时,元素将是键而不是整数。所以我们得到[(元素0,0),(元素1,0)…]

dict(map(reversed,enumerate(set)(map(tuple,label_list kаааа))
只需从上一步得到的元组列表中创建一个字典,它们是我们可以像访问任何其他字典一样访问的键(即使用
dictionary[element]
语法)


该行的其余部分与其他列表一样。它会迭代您的原始标签列表,并访问我们创建的字典,以获得与每个元素相关联的唯一编号。

这里有一行,只是为了好玩:

 [dict( map( reversed, enumerate( set( map(tuple, label_list)))))[tuple(item)] for item in label_list]
缺点(除了不可读之外)是它创建字典的次数与标签列表中的项目相同

要解释其工作原理,请从内到外阅读:

map(tuple,label\u list)
将tuple函数应用(或“映射”)到label\u 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)))
这将反转上面列表中的元素,以便在下一步创建字典时,元素将是键而不是整数。所以我们得到[(元素0,0),(元素1,0)…]

dict(map(reversed,enumerate(set)(map(tuple,label_list kаааа))
只需从上一步得到的元组列表中创建一个字典,它们是我们可以像访问任何其他字典一样访问的键(即使用
dictionary[element]
语法)


该行的其余部分与其他列表一样。它会迭代您的原始标签列表,并访问我们创建的字典,以获取与每个元素相关联的唯一编号。

您的输出是否有意为4而不是3?@Kevin我认为问题的实质是,如果
标签列表
中的元素尚未被迭代,那么它的标签就是它在列表中的当前索引。如果已看到该元素,则其标签是同一元素第一次出现的索引。@Ajax1234,这是对预期输出的合理解释。我最初的解释是,如果一个元素没有被迭代,那么它的标签是尚未发出的最小数字。我认为这对于“连续数字顺序”更有意义,但当然只有在4确实是一个输入错误的情况下才有意义。您的输出是否有4而不是3的意图?@Kevin我认为问题的本质是,如果
label\u list
中的一个元素尚未被迭代,那么它的标签就是它在列表中的当前索引。如果元素已经被看到,那么它的标签就是同一元素第一次出现的索引。@Ajax1234,这是对