在Python中,您可以在列表推导中使用多个迭代器,例如
[(x,y) for x in a for y in b]
Run Code Online (Sandbox Code Playgroud)
对于一些合适的序列a和b.我知道Python列表推导的嵌套循环语义.
我的问题是:理解中的一个迭代器可以指向另一个吗?换句话说:我可以这样:
[x for x in a for a in b]
Run Code Online (Sandbox Code Playgroud)
外循环的当前值是内部的迭代器?
例如,如果我有一个嵌套列表:
a=[[1,2],[3,4]]
Run Code Online (Sandbox Code Playgroud)
列表理解表达式将实现此结果:
[1,2,3,4]
Run Code Online (Sandbox Code Playgroud)
?? (请仅列出理解答案,因为这是我想要找到的).
在Python中,是否有一种交错两个相同长度列表的好方法?
说我给[1,2,3]
和[10,20,30]
.我想把它们变成[1,10,2,20,3,30]
.
我尝试在内部列表中使用外部列表理解的值:
[ x for x in range(y) for y in range(3) ]
Run Code Online (Sandbox Code Playgroud)
但不幸的是,这引发了一个NameError,因为名称y
是未知的(尽管外部列表理解指定了它).
这是Python的限制(尝试过2.7.3和3.2.3)还是有充分的理由说明为什么这不起作用?
有计划摆脱限制吗?
是否有解决方法(一些不同的语法,我可能没想到)来实现我想要的?
测试用例:
group_ordered([1,3,2,3,6,3,1]) = [1,1,3,3,3,2,6]
group_ordered([1,2,3,4,5,6,1]) = [1,1,2,3,4,5,6]
Run Code Online (Sandbox Code Playgroud)
我已经有了一些代码,但它很丑陋并且在大型列表上也可能很慢,因为对于每个独特的项目我都在查看整个列表.我提出了这个算法,但我想知道是否有更快,更清洁或更pythonic的方式我可以做到这一点:
def make_order_list(list_in):
order_list = []
for item in list_in:
if item not in order_list:
order_list.append(item)
return order_list
def group_ordered(list_in):
if list_in is None:
return None
order_list = make_order_list(list_in)
current = 0
for item in order_list:
search = current + 1
while True:
try:
if list_in[search] != item:
search += 1
else:
current += 1
list_in[current], list_in[search] = list_in[search], list_in[current]
search += 1
except IndexError:
break
return list_in
Run Code Online (Sandbox Code Playgroud) 我完全被难住了:
indices = numpy.array([b for a in x for b in a if not b==k])
Run Code Online (Sandbox Code Playgroud)
[b for a in x for b in a if not b==k]
在x
作为整数的二维数组和k
作为整数的上下文中,关于我应该如何阅读的任何指针?或者加括号来帮助我理解事物的优先级?