我们可以通过理解来做到吗?

时间:2020-12-21 16:35:14

标签: python list dictionary

我有一个清单:

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))。

3 个答案:

答案 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]}

所以答案是肯定的,它可以在列表理解中完成。但我不会推荐它。