是否可以为列表理解中的每个项目返回2个(或更多)项目?
我想要的(例子):
[f(x), g(x) for x in range(n)]
Run Code Online (Sandbox Code Playgroud)
应该回来 [f(0), g(0), f(1), g(1), ..., f(n-1), g(n-1)]
所以,要替换这段代码:
result = list()
for x in range(n):
result.add(f(x))
result.add(g(x))
Run Code Online (Sandbox Code Playgroud) 考虑下面的Python代码,我在新的list2中添加了所有项目,索引从list1的1到3:
for ind, obj in enumerate(list1):
if 4> ind > 0: list2.append(obj)
Run Code Online (Sandbox Code Playgroud)
如果我无法通过枚举访问索引,你会如何使用python list comprehension编写这个?
就像是:
list2 = [x for x in list1 if 4>ind>0]
Run Code Online (Sandbox Code Playgroud)
但由于我没有'ind'号码,这会有效吗?:
list2 = [x for x in enumerate(list1) if 4>ind>0]
Run Code Online (Sandbox Code Playgroud) 所以我正在玩list
对象,并发现一些奇怪的事情,如果list
创建list()
它使用更多的内存,而不是列表理解?我正在使用Python 3.5.2
In [1]: import sys
In [2]: a = list(range(100))
In [3]: sys.getsizeof(a)
Out[3]: 1008
In [4]: b = [i for i in range(100)]
In [5]: sys.getsizeof(b)
Out[5]: 912
In [6]: type(a) == type(b)
Out[6]: True
In [7]: a == b
Out[7]: True
In [8]: sys.getsizeof(list(b))
Out[8]: 1008
Run Code Online (Sandbox Code Playgroud)
来自文档:
列表可以通过以下几种方式构建:
- 使用一对方括号表示空列表:
[]
- 使用方括号,用逗号分隔项目:
[a]
,[a, b, c]
- 使用列表理解:
[x for x in iterable]
- 使用类型构造函数:
list()
或list(iterable)
但似乎使用list()
它会占用更多内存. …
加入清单:
>>> ''.join([ str(_) for _ in xrange(10) ])
'0123456789'
Run Code Online (Sandbox Code Playgroud)
join
必须采取迭代.
显然,join
这个论点是[ str(_) for _ in xrange(10) ]
,这是一个列表理解.
看这个:
>>>''.join( str(_) for _ in xrange(10) )
'0123456789'
Run Code Online (Sandbox Code Playgroud)
现在,join
这个论点只是str(_) for _ in xrange(10)
,不[]
,但结果是一样的.
为什么?是否str(_) for _ in xrange(10)
也会产生一个列表或一个可迭代?
如果我对列表推导做了些什么,它会写入一个局部变量:
i = 0
test = any([i == 2 for i in xrange(10)])
print i
Run Code Online (Sandbox Code Playgroud)
这打印"9".但是,如果我使用生成器,它不会写入局部变量:
i = 0
test = any(i == 2 for i in xrange(10))
print i
Run Code Online (Sandbox Code Playgroud)
这打印"0".
这种差异有什么好的理由吗?这是设计决策,还是生成器和列表推导的实现方式的随机副产品?就个人而言,如果列表推导没有写入局部变量,那对我来说似乎更好.
如果我有两个字符串,'abc'
并且'def'
,我可以使用两个for循环获得它们的所有组合:
for j in s1:
for k in s2:
print(j, k)
Run Code Online (Sandbox Code Playgroud)
但是,我希望能够使用列表理解来做到这一点.我尝试了很多方法,但从未设法得到它.有谁知道如何做到这一点?
我有这样一条线:
filter(lambda x: x == 1, [1, 1, 2])
Run Code Online (Sandbox Code Playgroud)
Pylint正在显示警告:
W: 3: Used builtin function 'filter'
Run Code Online (Sandbox Code Playgroud)
这是为什么?列表理解推荐的方法是什么?
当然我可以像这样重写:
[x for x in [1, 1, 2] if x == 1]
Run Code Online (Sandbox Code Playgroud)
而且我没有收到任何警告,但我想知道是否有这样的PEP?
Python具有语法上的甜蜜列表理解:
S = [x**2 for x in range(10)]
print S;
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
Run Code Online (Sandbox Code Playgroud)
在PHP中我需要做一些循环:
$output = array();
$Nums = range(0,9);
foreach ($Nums as $num)
{
$out[] = $num*=$num;
}
print_r($out);
Run Code Online (Sandbox Code Playgroud)
要得到:
数组([0] => 0 [1] => 1 [2] => 4 [3] => 9 [4] => 16 [5] => 25 [6] => 36 [7] => 49 [8] => 64 [9] => 81)
反正有没有在PHP中获得类似的列表理解语法?无论如何使用PHP 5.3中的任何新功能吗?
谢谢!
php arrays language-comparisons list-comprehension higher-order-functions
如果我有一个列表理解(例如)像这样:
['' for x in myList]
Run Code Online (Sandbox Code Playgroud)
有效地为列表中的每个元素创建一个具有空字符串的新列表,我从不使用x
.有没有更简洁的方法来写这个,所以我不必声明未使用的x
变量?
我想了解嵌套列表理解.下面,我列出了一个列表推导表达式和它们的for循环等价物.
我想知道我的理解是否正确.
例如,
[(min([row[i] for row in rows]),max([row[i] for row in rows]))
for i in range(len(rows[0]))]
Run Code Online (Sandbox Code Playgroud)
相当于
result=[]
for i in range(len(rows[0])):
innerResult=[]
for row in rows:
innerResult.append(row[i])
innerResult2=[]
for row in rows:
innerResult2.append(row[i])
tuple=(min(innerResult), max(innerResult2))
result.append(tuple)
Run Code Online (Sandbox Code Playgroud)
如果我可以概括,我想
[exp2([exp1 for x in xSet]) for y in ySet]
Run Code Online (Sandbox Code Playgroud)
表格可以翻译成以下内容.(我希望我对此是正确的)
result=[]
for y in ySet:
innerResult =[]
for x in xSet:
innerResult.append(exp1)
exp2Result = exp2(innerResult)
result.append(exp2Result)
Run Code Online (Sandbox Code Playgroud)
对于更简单的情况,
[exp1 for x in xSet for y in ySet]
Run Code Online (Sandbox Code Playgroud)
等于
result=[]
for x in xSet: …
Run Code Online (Sandbox Code Playgroud)