我有一份清单:
lst = [1, 1, 3, 5, 1, 4, 4]预期输出(键是数字,值是这些数字的索引):
{1: [0, 1, 4], 3: [2], 5: [3], 4: [5, 6]}嗯,我知道有很多方法可以实现that.Like:
res = defaultdict(list)
for idx, e in enumerate(lst):
res[e].append(idx)或者:
res = {}
for idx, e in enumerate(lst):
res.setdefault(e, []).append(idx)我不知道我们是否能用一种简单的理解来实现它。只是为了好玩:)。
效率并不重要(最好是O(n))。
发布于 2020-12-21 16:46:07
我认为最有效的方法是:
from itertools import groupby
from operator import itemgetter
lst = [1, 1, 3, 5, 1, 4, 4]
res = { k : [i for i, _ in group] for k, group in groupby(sorted(enumerate(lst), key=itemgetter(1)), key=itemgetter(1))}
print(res)输出
{1: [0, 1, 4], 3: [2], 4: [5, 6], 5: [3]}我是O(NlogN)
发布于 2020-12-21 17:28:04
正如凯文·梅奥(Kevin Mayo )所说的那样,我补充说,效率不是一个问题:
lst = [1, 1, 3, 5, 1, 4, 4]
lst_s = {key: [i for i, value in enumerate(lst) if value == key]
for key in set(lst)}
print(lst_s)
# {1: [0, 1, 4], 3: [2], 4: [5, 6], 5: [3]}range(len(lst))与
的变异
lst = [1, 1, 3, 5, 1, 4, 4]
lst_s = {key: [i for i in range(len(lst)) if lst[i] == key]
for key in set(lst)}
print(lst_s)
# {1: [0, 1, 4], 3: [2], 4: [5, 6], 5: [3]}发布于 2020-12-21 21:06:44
这是一个字典理解,将执行O(n)的时间。
lst = [1, 1, 3, 5, 1, 4, 4]
res = { n:d.setdefault(n,[]).append(i) or d[n] for d in [dict()] for i,n in enumerate(lst) }
print(res)
# {1: [0, 1, 4], 3: [2], 5: [3], 4: [5, 6]}因此,答案是肯定的,这可以在一个清单的理解。但我不推荐。
https://stackoverflow.com/questions/65396551
复制相似问题