相关疑难解决方法(0)

如何检查变量是否存在?

我想检查变量是否存在.现在我正在做这样的事情:

try:
   myVar
except NameError:
   # Do something.
Run Code Online (Sandbox Code Playgroud)

还有其他方法没有例外吗?

python variables exception

849
推荐指数
9
解决办法
91万
查看次数

如何len(generator())

Python生成器非常有用.它们优于返回列表的函数.但是,你可以len(list_returning_function()).有办法len(generator_function())吗?

更新:
当然len(list(generator_function()))会工作.....
我正在尝试使用我在我正在创建的新生成器中创建的生成器.作为新发电机计算的一部分,它需要知道旧发电机的长度.但是我想将它们与发生器保持相同的属性,特别是 - 不要将整个列表保存在内存中,因为它可能长.

更新2:
假设发生器即使从第一步开始就知道它的目标长度.此外,没有理由维护len()语法.示例 - 如果Python中的函数是对象,我不能将长度分配给新生成器可以访问的此对象的变量吗?

python generator

128
推荐指数
8
解决办法
9万
查看次数

发电机输出长度

Python提供了一种很好的方法来获取渴望迭代的长度,len(x)也就是说.但是我找不到任何类似于生成器理解和函数所代表的惰性迭代.当然,写下这样的东西并不难:

def iterlen(x):
  n = 0
  try:
    while True:
      next(x)
      n += 1
  except StopIteration: pass
  return n
Run Code Online (Sandbox Code Playgroud)

但我无法摆脱我重新实现自行车的感觉.

(当我输入这个函数时,一个想法让我大吃一惊:也许真的没有这样的功能,因为它"摧毁"了它的论点.虽然不是我的情况的问题).

PS:关于第一个答案 - 是的,类似的东西len(list(x))也会起作用,但这会大大增加内存的使用.

PPS:重新检查......无视PS,似乎我在尝试时犯了一个错误,它运行正常.抱歉,添麻烦了.

python iterable generator

117
推荐指数
8
解决办法
6万
查看次数

计算生成器/迭代器中项目数的最短方法是什么?

如果我想要迭代中的项目数量而不关心元素本身,那么获得该元素的pythonic方法是什么?现在,我会定义

def ilen(it):
    return sum(itertools.imap(lambda _: 1, it))    # or just map in Python 3
Run Code Online (Sandbox Code Playgroud)

但我明白lambda接近被认为是有害的,lambda _: 1当然不是很漂亮.

(这个用例是计算匹配正则表达式的文本文件中的行数,即grep -c.)

python iterator iterable generator

60
推荐指数
5
解决办法
3万
查看次数

计算日期之间的天数,忽略周末

如何计算忽略周末的两个日期之间的天数?

python

49
推荐指数
8
解决办法
5万
查看次数

在列表中识别连续重复项的最Pythonic方法是什么?

我有一个整数列表,我希望能够识别连续的重复块:也就是说,我想生成一个保留顺序的双重列表,其中每个双重包含(int_in_question,出现次数).

例如,如果我有一个列表,如:

[0, 0, 0, 3, 3, 2, 5, 2, 6, 6]
Run Code Online (Sandbox Code Playgroud)

我希望结果如下:

[(0, 3), (3, 2), (2, 1), (5, 1), (2, 1), (6, 2)]
Run Code Online (Sandbox Code Playgroud)

我有一个相当简单的方法,使用for循环,temp和计数器:

result_list = []
current = source_list[0]
count = 0
for value in source_list:
    if value == current:
        count += 1
    else:
        result_list.append((current, count))
        current = value
        count = 1
result_list.append((current, count))
Run Code Online (Sandbox Code Playgroud)

但我真的很喜欢python的函数式编程习语,我希望能够通过一个简单的生成器表达式来实现这一点.但是我发现在使用发电机时很难保留子计数.我有一种感觉,两个步骤可能会让我在那里,但是现在我很难过.

是否有一种特别优雅/ pythonic的方式来做到这一点,特别是对于发电机?

python list generator duplicates

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

如何获得itertools.product的长度?

我正在使用itertools迭代我输入参数的所有可能组合的数值模拟.在下面的示例中,我有两个参数和六种可能的组合:

import itertools

x = [0, 1]
y = [100, 200, 300]

myprod = itertools.product(x, y)

for p in myprod:
    print p[0], p[1]
    # run myfunction using p[0] as the value of x and p[1] as the value of y
Run Code Online (Sandbox Code Playgroud)

如何获得myprod(示例中的六个)的大小?我需要在for循环开始之前打印它.

我明白myprod不是一个清单.我可以计算len(list(myprod)),但这会消耗迭代器,因此for循环不再有效.

我试过了:

myprod2=copy.deepcopy(myprod)
mylength = len(list(myprod2))
Run Code Online (Sandbox Code Playgroud)

但这也行不通.我可以:

myprod2=itertools.product(x,y)
mylength = len(list(myprod2))
Run Code Online (Sandbox Code Playgroud)

但它不是优雅和pythonic!

python python-itertools

13
推荐指数
3
解决办法
7071
查看次数

Python 的迭代器解包(star unpacking)是如何实现的(或者,解包自定义迭代器涉及哪些神奇的方法?)

我正在编写一个定义__iter__and的类__len__,其中 的值__len__取决于__iter__. 我得到了一个有趣的RecursionError.

语言版本:Python 3.8.6、3.7.6。 示例仅用于说明错误。

在以下示例中,Iter.__len__()尝试解包self,将结果存储在 a 中list,然后尝试调用该list.__len__()列表上的内置函数以获取长度。

>>> class Iter:
...     def __iter__(self):
...         return range(5).__iter__()
...     def __len__(self):
...         return list.__len__([*self])
...
>>> len(Iter())
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<stdin>", line 5, in __len__
  File "<stdin>", line 5, in __len__
  File "<stdin>", line 5, in __len__
  [Previous line repeated 993 more times] …
Run Code Online (Sandbox Code Playgroud)

python iterator magic-methods python-3.x iterable-unpacking

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

计算可迭代对象中元素的数量

在不将元素存储在内存中的情况下(通过迭代)计算可迭代对象中元素数量的最佳方法是什么?

现在,我只是在做sum(1 for x in iterable)。我本来希望能在里面找到什么itertools,但似乎什么也没有。

python iterator iterable count

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

如何测量发电机序列的长度(列表补偿与发电机表达)

我有一个生成有限序列的生成器.为了确定这个序列的长度,我尝试了这两种方法:

 seq_len = sum([1 for _ in euler14_seq(sv)])  # list comp
Run Code Online (Sandbox Code Playgroud)

 seq_len = sum(1 for _ in euler14_seq(sv))    # generator expression
Run Code Online (Sandbox Code Playgroud)

sv 是序列的常量起始值.

我原本以为列表理解会慢一点,生成器表达式会更快,但事实证明相反.

我假设第一个会占用更多的内存,因为它首先在内存中创建一个完整的列表 - 部分原因我还认为它会更慢.

我的问题:这种观察是否可以推广?这是因为第二个声明与第一个声明中涉及两个发生器吗?

我看过这些什么是计算生成器/迭代器中项目数的最短方法?,生成器输出的长度, 是否有任何内置的方法来获取python中迭代的长度?并且看到了一些测量序列长度的其他方法,但我对list comp与generator表达式的比较特别好奇.

PS:当我决定根据昨天提出的问题解决欧拉项目#14时出现了这个问题.

(顺便说一句,关于使用'_'不需要变量值的地方的一般感觉是什么).

这是在Windows 7 64位下使用Python 2.7.2(32位)完成的

python sequences list-comprehension generator python-2.7

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

Itertools 组合/排列大小

是否真的可以看到 itertools.Combination 或其他对象的 len() ,而不将其具体化到列表中?
我可以用阶乘得到梳子的基数或排列,......但我想要一些概括的东西。

谢谢

python python-itertools

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