使用单个列表中的项的索引创建新的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])