对于这种列表理解,什么是正确的python语法?
任务:{x*y,使得x属于S&y是迭代计数} S是另一组吗 大概是这样的:对于这种列表理解,什么是正确的python语法?,python,list-comprehension,Python,List Comprehension,任务:{x*y,使得x属于S&y是迭代计数} S是另一组吗 大概是这样的: j=0 [i*j for j++ and i in S] [s1*1、s2*2、s3*3…] 对于已编辑的问题,您需要 [i * j for j, i in enumerate(S)] python没有++,因为它在语句和表达式之间保持清晰的区别。使用 [(i + 40) * i for i in xrange(60)] 另一种方法是 [i * j for i, j in enumerate(xrange(60)
j=0
[i*j for j++ and i in S]
[s1*1、s2*2、s3*3…]
对于已编辑的问题,您需要
[i * j for j, i in enumerate(S)]
python没有
++
,因为它在语句和表达式之间保持清晰的区别。使用
[(i + 40) * i for i in xrange(60)]
另一种方法是
[i * j for i, j in enumerate(xrange(60), start=40)]
还有一种方法是
[i * j for i, j in zip(xrange(40, 100), xrange(60))]
我认为第一种方法是最好的方法,因为它减少了函数调用,而且可读性最好
此外,如果您不知道绝对需要列表,请使用生成器表达式
((i + 40) * i for i in xrange(60))
这将允许您一次处理一个结果,而不会在内存中存储整个列表。您可以将生成器表达式传递给诸如
sum
、max
、min
和大多数其他内置函数。一种方法是与以下函数结合使用:
S = range(40,100)
[i*j for i,j in enumerate(S)]
查看其他答案,了解(许多)实现此目的的其他方法:):)我会在生成器中实现:
def fooGen(S):
j = 1
for i in S:
yield i * j
J += 1
“任务:{x*y,因此x属于S&y是迭代计数},其中S是另一个集合
[剪下i和j的介绍]
[s1*1、s2*2、s3*3…]
“”“ 一个非常简单的翻译:
[x * y for y, x in enumerate(S, start=1)]
或
可以将当前元素索引用作增量索引
>>> S=[2,4,6,8]
>>> [i*(S.index(i)+1) for i in S]
[2, 8, 18, 32]
>>>
所以你的c-ish“j++”是S.index(i)+1你必须更完整地解释你想要什么,因为你描述的是一个40*j的无限序列,我们根本不需要担心范围。当我第一次回答这个问题时,
S
是range(40100)
。当循环一个序列时,可以使用enumerate()函数src同时检索位置索引和相应的值:start
参数用于enumerate()
,因此您可以使用enumerate(S,start=1)
。@Aaron:对。在他的第一个例子中(删除后),他从1开始,把我扔到了那里@肯尼特:谢谢,这样更好(如果需要的话)。但是OP的索引是从0开始的,而不是从1开始。@Aaron:你叫什么“索引”,y(迭代计数)?看看他的最后一行:[s1*1,s2*2,s3*3…]。。。我看不到zero.OP有j
从0开始,而生成器函数对于生成器表达式所能做的事情来说是过度杀戮。-1这真是令人难以置信的混乱index
遍历列表以查找i
的索引,因此您只进行了一个O(n)操作,并将其转换为一个O(n**2)操作!另外,试一下S=[2,3,3,3,4]
问题是关于使用列表理解,也不是“快速实现”或“美丽实现”1)这只是蹩脚代码的(蹩脚)借口,2)你的蹩脚代码甚至不起作用。你的O(n):[S[i]*(i+1)代表范围内的i(0,len(S))]
[x * (y + 1) for y, x in enumerate(S)]
>>> S=[2,4,6,8]
>>> [i*(S.index(i)+1) for i in S]
[2, 8, 18, 32]
>>>