首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >我们能理解一下吗?

我们能理解一下吗?
EN

Stack Overflow用户
提问于 2020-12-21 16:35:14
回答 3查看 63关注 0票数 1

我有一份清单:

代码语言:javascript
复制
lst = [1, 1, 3, 5, 1, 4, 4]

预期输出(键是数字,值是这些数字的索引):

代码语言:javascript
复制
{1: [0, 1, 4], 3: [2], 5: [3], 4: [5, 6]}

嗯,我知道有很多方法可以实现that.Like:

代码语言:javascript
复制
res = defaultdict(list)
for idx, e in enumerate(lst):
    res[e].append(idx)

或者:

代码语言:javascript
复制
res = {}
for idx, e in enumerate(lst):
    res.setdefault(e, []).append(idx)

我不知道我们是否能用一种简单的理解来实现它。只是为了好玩:)。

效率并不重要(最好是O(n))。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2020-12-21 16:46:07

我认为最有效的方法是:

代码语言:javascript
复制
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)

输出

代码语言:javascript
复制
{1: [0, 1, 4], 3: [2], 4: [5, 6], 5: [3]}

我是O(NlogN)

票数 4
EN

Stack Overflow用户

发布于 2020-12-21 17:28:04

正如凯文·梅奥(Kevin Mayo )所说的那样,我补充说,效率不是一个问题:

代码语言:javascript
复制
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))

的变异

代码语言:javascript
复制
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]}
票数 1
EN

Stack Overflow用户

发布于 2020-12-21 21:06:44

这是一个字典理解,将执行O(n)的时间。

代码语言:javascript
复制
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]}

因此,答案是肯定的,这可以在一个清单的理解。但我不推荐。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65396551

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档