使用单个列表中的项的索引创建新的python列表

使用单个列表中的项的索引创建新的python列表,python,list,Python,List,我想列出一个列表,例如[0,1,0,1,2,2,3],并为每个唯一元素列出(index+1)。例如,对于上述内容,它将是[[1,3],[2,4],[5,6],[7] 现在,我的解决方案是最笨重的: list_1 = [0, 1, 0, 1, 2, 2, 3] maximum = max(list_1) master = [] for i in range(maximum + 1): temp_list = [] for j,k in enumerate(list_1):

我想列出一个列表,例如
[0,1,0,1,2,2,3]
,并为每个唯一元素列出
(index+1)
。例如,对于上述内容,它将是
[[1,3],[2,4],[5,6],[7]

现在,我的解决方案是最笨重的:

list_1 = [0, 1, 0, 1, 2, 2, 3]
maximum = max(list_1)
master = []
for i in range(maximum + 1):
    temp_list = []
    for j,k in enumerate(list_1):
        if k == i:
            temp_list.append(j + 1)
    master.append(temp_list)
print master
如果您有任何关于更具蟒蛇风格的想法,我们将不胜感激

master = [[i+1 for i in range(len(list_1)) if list_1[i]==j] for j in range(max(list_1)+1)]

这与您当前的代码完全相同,但它使用列表理解,这通常是解决此类问题的一种非常好的python方法。

我将分两步完成:

  • 构建一个映射
    {value:[列表,of,索引],…}

    index_map = {}
    for index, value in enumerate(list_1):
        index_map.setdefault(value, []).append(index+1)
    
  • 将字典中的值列表提取到
    主列表中
    列表:

    master = [index_map.get(index, []) for index in range(max(index_map)+1)]
    
  • 例如,这将给出:

    >>> index_map
    {0: [1, 3], 1: [2, 4], 2: [5, 6], 3: [7]}
    >>> master
    [[1, 3], [2, 4], [5, 6], [7]]
    
    这个实现只在整个列表上迭代一次(
    O(n)
    ,其中
    n
    len(list_1)
    ),而到目前为止,其他实现为每个唯一元素在整个列表上迭代一次(
    O(n*m)
    ,其中
    m
    len(set(list_1))
    )。通过使用
    max(d)
    而不是
    max(list_1)
    只需迭代唯一项的长度,这也更有效


    如果你做的话,实现可能会稍微简单一些。

    我不明白你想做什么。可能是使用?我很好奇你为什么在输出列表中使用基于1的索引。这可能会让人困惑;OTOH:)是的,这是为了输出到另一个需要在输入中使用基于1的索引的程序:(.注意这是
    O(len(list_1)*len(set(list_1))
    @jornsharpe有趣,但是OP并没有提到效率,而是简单性(这是你的解决方案,比我的更简单)。注意这是
    O(len(list_1)*len set(list_1)))
    @jornsharpe指出。然而,问题是让代码更“Pythonic”,而不是更高效。我认为OP的代码不是立即可读的(“可读性计数”),这就是问题所在。你的解决方案之所以好,不是因为效率,而是因为它既可读又高效。
    list_1 = [0, 1, 0, 1, 2, 2, 3]
    master = []
    for i in range(max(list_1)+1):
        master.append([j+1 for j,k in enumerate(list_1) if k==i])