添加可变长度列表的字典理解

2024-09-24 22:29:52 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在寻找一种pythonic方法来创建一个列表字典,您可以在其中为一系列键的列表添加值。因此,一个字典n存储了最大值为1000的数字之和,数字之和为键,例如:

n[25] = [799, 889, 898, 979, 988, 997]

使用基本列表理解不起作用,因为它会覆盖较小的值,并且每个键只允许一个最大的值

n = {sumdigits(i): i for i in range(1000)}

下面我有一个两行的工作版本,但我很好奇是否有一个简洁的单行解决方案来创建一个可变长度列表的字典

def sumdigits(x):
  return sum(int(i) for i in str(x))

n = defaultdict(list)
for i in range(1000):  
  n[sumdigits(i)].append(i)

Tags: 方法in版本列表forreturn字典def
3条回答

你已经拥有的是非常棒的。这绝对没有什么问题,最关键的是,发生了什么是显而易见的

如果你真的想要一个单线解决方案,我认为你需要两个循环。一个循环用于n的值,该值可以是1到27(sumdigits(999))之间的任何值。然后另一个循环遍历范围为1-1000的项目

下面是它的样子,但从时间复杂性的角度来看,它是非常低效的。你所拥有的时间复杂度O(n)是好的。但以理解的方式做这件事很复杂 O(n^n(n-1))。因为对于每个关键点,您必须在整个范围1-1000内进行迭代,但大多数都会被丢弃

{n: [i for i in range(1000) if sumdigits(i) == n] for n in range(sumdigits(999) + 1)}

如果您确实想要一行解决方案,您可以执行以下组合列表和听写理解:

dct = {sumdigits(i): [j for j in range(1000) if sumdigits(i)==sumdigits(j)] for i in range(1000)}

也就是说,我不认为它比您自己建议的简单for循环更具pythonic,我认为出于性能原因,您也应该坚持使用它

这也可能是一行(因为在两行解决方案中不计算defaultdict初始化)。它的优点是比其他解决方案快得多

n = defaultdict(list)
{n[sum(int(d) for d in str(nb))].append(nb) for nb in range(1000)}

或者在一行中(使用walrus operatorpython3.8+)

{n := collections.defaultdict(list)[sum(int(i) for i in str(x))].append(x) for x in range(NB)}

相关问题 更多 >