我有一个清单:
lst = [1, 1, 3, 5, 1, 4, 4]
预期输出(键是数字,值是这些数字的索引):
{1: [0, 1, 4], 3: [2], 5: [3], 4: [5, 6]}
嗯,我知道有很多方法可以实现这一点。比如:
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)
)。
答案 0 :(得分:4)
我认为最有效的是:
class MyEntityClass
{
/**
* @var int
*
* @ORM\Id
* @ORM\Column(type="uuid")
*/
private $id;
public function getId(): string
{
return generate_unique_id_just_for_my_join()
}
}
输出
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)
这是O(NlogN)
答案 1 :(得分:1)
我添加到混合中,因为@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]}
VARIATION WITH 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]}
答案 2 :(得分:1)
这是一个将在 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]}
所以答案是肯定的,它可以在列表理解中完成。但我不会推荐它。