相关疑难解决方法(0)

停止列表选择?

想象一下,我有一个元组的顺序列表:

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 list python-2.7

14
推荐指数
1
解决办法
1188
查看次数

短路列表理解

有几次我想要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)是一个选择,但是:

  • 它不是特别pythonic - 不像一段时间的理解那样可读
  • 它可能不如CPython理解那样高效或快速
  • 它需要一个额外的步骤来转换输出,而这可以直接理解,例如 [x.lower() for x in mylist]
  • 甚至原作者似乎也不喜欢它 …

python list-comprehension generator-expression

7
推荐指数
1
解决办法
1684
查看次数

在列表理解中使用while循环

说我有一个功能:

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 list-comprehension list

5
推荐指数
2
解决办法
1万
查看次数

终止生成器表达式

我有一个心理障碍,是否有一个通常的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但是那些家伙要求你提前知道要消耗多少件物品.

python generator

2
推荐指数
1
解决办法
261
查看次数