想象一下,我有一个元组的顺序列表:
s = [(0,-1), (1,0), (2,-1), (3,0), (4,0), (5,-1), (6,0), (7,-1)]
Run Code Online (Sandbox Code Playgroud)
给定一个参数X,我想选择所有第一个元素等于或大于X但不包括第一个元组的元组,第一个元组具有-1作为第二个元素.
例如,如果X = 3,我想选择列表[(3,0), (4,0)]
我的一个想法是:获取切断键
E = min (x [0] for x in s if (x [0] >= X) and (x [1] == -1) )
Run Code Online (Sandbox Code Playgroud)
然后在X和之间选择带键的元素E:
R = [x for x in s if X <= x [0] < E]
Run Code Online (Sandbox Code Playgroud)
这给了我在R中想要的东西,但它似乎效率很低,涉及两次表扫描.我可以在for循环中执行它,丢弃键太小的元组,并在我击中第一个阻塞元组时中断.但对于像狗一样的跑步与列表选择相比.
这样做是否有超高效,python-esque(2.7)方式?
有几次我想要python语法来缩短列表推导或生成器表达式.
这是一个简单的列表理解,以及python中循环的等价物:
my_list = [1, 2, 3, 'potato', 4, 5]
[x for x in my_list if x != 'potato']
result = []
for element in my_list:
if element != 'potato':
result.append(element)
Run Code Online (Sandbox Code Playgroud)
在语言中不支持理解短路.提出的语法,以及python中循环的等价物:
[x for x in my_list while x != 'potato']
# --> [1, 2, 3]
result = []
for element in my_list:
if element != 'potato':
result.append(element)
else:
break
Run Code Online (Sandbox Code Playgroud)
它应该适用于任意迭代,包括无限序列,并且可以扩展到生成器表达式语法.我知道这list(itertools.takewhile(lambda x: x != 'potato'), my_list)是一个选择,但是:
[x.lower() for x in mylist]说我有一个功能:
x=[]
i=5
while i<=20:
x.append(i)
i=i+10
return x
Run Code Online (Sandbox Code Playgroud)
无论如何有这样将其转换为列表理解吗?
newList = [i=05 while i<=20 i=i+10]
Run Code Online (Sandbox Code Playgroud)
我收到语法错误
我有一个心理障碍,是否有一个通常的python 1-liner来终止列表理解或基于某些条件的genex?用法示例:
def primes():
# yields forever e.g. 2, 3, 5, 7, 11, 13 ...
[p for p in primes() if p < 10]
# will never terminate, and will go onto infinite loop consuming primes()
[p for p in primes() while p < 10]
# should return [2, 3, 5, 7], and consumed 5 items from my generator
Run Code Online (Sandbox Code Playgroud)
我知道itertools消费,islice但是那些家伙要求你提前知道要消耗多少件物品.