您能根据理解中转换的结果筛选列表理解吗?
例如,假设要删除列表中的每个字符串,并删除仅为空格的字符串。我可以很容易地做到以下几点:
filter(None, [x.strip() for x in str_list])
但这会重复列表两次。或者,您可以执行以下操作:
[x.strip() for x in str_list if x.strip()]
但是该实现执行了两次strip。我也可以用发电机:
for x in str_list:
x = x.strip()
if x:
yield x
但现在这是一堆代码。是否有任何方法可以进行上述操作:(1)只迭代一次;(2)
由于某种原因,这段代码似乎进入了一个无限循环,我不知道为什么
import timeit
t = timeit.Timer(stmt="for num in num_list: print(num)",
setup="num_list = [digit for digit in range(1, 101)]")
print(t.timeit())
我已经通过Anaconda安装了python版本3.6.2。
我尝试在Spyder IDE和命令提示符中运行它,两者都有相同的结果。
如果我将设置改为生成器,而不是列表理解,一切都
我试图理解Python中的生成器,并实现了以下内容:
def yfun():
print("into y fun ... ")
for x in range(1,6):
print("tryin to yield : {}".format(x))
yield x
yieldVar = yfun()
for val in yieldVar:
print("value generated -> ", val)
输出如下:
into y fun ...
tryin to yield : 1
我正在玩python中的一些循环。我非常熟悉"for“循环的用法:
for x in y:
do something
您还可以使用循环创建一个简单的列表:
i = []
for x in y:
i.append(x)
然后我最近在Stack上发现了一种很好的高效的循环类型,用来构建一个列表(这种类型的循环有名字吗?我真的很想知道,这样我就可以更好地搜索它):
[x.name for x in y]
好吧,也就是说,我想进一步使用最后一种类型的循环,并尝试使用相同类型的逻辑构建一个python字典:
{x[row.SITE_NAME] = row.LOOKUP_TABLE
我今天在Python解释器中编写了以下内容:
>>> def test():
... for c in ['a', 'b', 'c', 'd']: yield c
...
>>> a = test()
>>> a
<generator object test at 0x2556a00>
>>> a.next()
'a'
>>> a.next()
'b'
这让我很惊讶。test不应该返回(或生
这是一个示例脚本,用来测试test的用法...我做错了吗?它总是返回'1'...
#!/usr/bin/python
def testGen():
for a in [1,2,3,4,5,6,7,8,9,10]:
yield a
w = 0
while w < 10:
print testGen().next()
w += 1
我正在使用Python3.8中的以下代码:
a = range(10)
limits = (5, 3) # order of limits doesn't matter
a = (i for i in a if i > limit[0])
a = (i for i in a if i > limit[1])
print(list(a))
正如注释中所引用的,在这种情况下首先应用哪个限制并不重要;无论是limits = (5, 3)还是(3, 5),最后一行的输出在这两种情况下都是[6, 7, 8, 9]。但是,对于代码的(看似)无关紧要的重构,情况就不再是这样了:
a =
我是Python和Gensim的新手。我目前正在学习关于gensim ()的一个教程。关于这一行代码,我有两个问题:
# collect statistics about all tokens
>>> dictionary = corpora.Dictionary(line.lower().split() for line in open('mycorpus.txt'))
( 1)在开始构建字典之前,文件mycorpus.txt是否已完全加载到内存中?本教程明确拒绝:
Similarly, to construct the dictionary without
我一直在阅读python中的关键字yield和生成器,我想知道我是否对它有正确的理解--时间复杂性。
下面是我的生成器函数,用于获取因素:
def calc_factors(n):
for k in range(0, n+1): # this is the second "for" loop
if n % k == 0:
yield k
我把这个发生器称为:
>>> for factor in calc_factor(100): # this is the first "for" loo
有人能用简单的术语为我解释一下这段代码吗。
prompts = ("Enter Strength Attribute, between 1 and 50: ", "Enter Skill Attribute, between 1 and 50: ") # I already now this so no need to explain it
answers = [int(input(p)) for p in prompts]
if not all(0 < a <=50 for a in answers):
# other code her
我目前正在处理Python中的Project 53。这个解决方案很简单,但涉及到以下清单理解:
[scipy.misc.comb(n, r, exact=True)
for n in range(1,maxn+1)
for r in range(0,n+1)
if scipy.misc.comb(n, r, exact=True) > threshold]
不过,我担心的是,scipy.misc.comb()函数将在每次迭代中调用两次。是否有任何方法用某种引用来替换某一种或另一种情况;或者,解释器是否足够聪明,能够意识到这两个实例将评估为相同的事物?
在t.cursor()方法中,会为一小部分In抛出Twython库中的异常。但是,每当异常发生时,抛出的代码中的实际行是try/ the块之后的for-循环,这将阻止调用continue。
如何才能在try块中抛出异常,而不被not块捕获,然后在一些(大部分)不相关的代码中出现?
是的,这是一个401错误,但这只是返回错误代码的Twitter API。在现实中,我是正确的认证。我还知道,我可以将but块移到for-循环之后,但我只想知道这是如何发生的。
from twython import Twython
t = Twython(...)
# ...
for id in ids:
我尝试在N循环中生成不同的随机顺序,但python似乎生成相同的顺序。下面的代码是否按照我的预期正确编写?
import random
import time
def funcA():
nodeCount = 10
order = range(0, nodeCount)
random.seed(0x87654321)
random.shuffle(order)
print("Shuffle order - ")
print(order)
if __name__ =
我试图在python中创建一个素数生成器,但遇到了一个问题。这是我的密码
def prime_generator():
n = 2
while n < 100:
for i in range(2, n):
if n % i == 0:
break
else:
yield n
n += 1
我认为这应该会产生小于100的素数。它由一个while循环组成,该循环以n开头,从2开始,并使用for循环来决定它是否为素数。如果n不是素数,则它将n递增1,
下面的python代码生成(0,0),(0,7).(0,693),而不是组合所有3的倍数和7的倍数的预期元组列表:
multiples_of_3 = (i*3 for i in range(100))
multiples_of_7 = (i*7 for i in range(100))
list((i,j) for i in multiples_of_3 for j in multiples_of_7)
此代码解决了以下问题:
list((i,j) for i in (i*3 for i in range(100)) for j in (i*7 for i in range(100)))
问题
下面的代码来自Jake的手册第3章。文件中的每一行都是有效的JSON。虽然我不认为文件的细节对于回答这个问题至关重要,但是文件的url是。
# read the entire file into a Python array
with open('recipeitems-latest.json', 'r') as f:
# Extract each line
data = (line.strip() for line in f)
# Reformat
我对lxml很陌生,对python也很陌生,并且找不到解决以下问题的方法:
我需要导入几个表,从第3行开始,有3列和未定义的行数。
当任何行的第二列为空时,此行将被丢弃,表的处理将中止。
下面的代码可以很好地打印表的数据(但之后我无法重用数据):
from lxml.html import parse
def process_row(row):
for cell in row.xpath('./td'):
print cell.text_content()
yield cell.text_content()
def p
join()函数接受一个可迭代的参数。然而,我想知道为什么:
text = 'asdfqwer'
这是:
''.join([c for c in text])
明显快于:
''.join(c for c in text)
长字符串(即text * 10000000)也会发生同样的情况。
观察两次长字符串执行的内存占用情况,我认为它们都会在内存中创建一个和唯一一个字符列表,然后将它们加入到一个字符串中。因此,我猜想,可能区别只在于join()如何从生成器中创建这个列表,以及Python解释器在看到[c for c in text]时是如何做同样的事
我知道这个问题:
它的范围更广,技术基础更少。所有的答案都没有被选中。我也阅读了这些答案,除了一个可能的例外,没有找到我正在寻找的东西。我想问一个更精确的问题,以帮助我理解一些细节。
我刚才问过这个问题:
也许标题或者我问这个问题的方式是误导的,因为我得到的回答不是针对我的意图,问题在几秒钟内就结束了。
所以我会在这里澄清。
考虑以下代码:
p = [k for k in range(1,1000)]
i = iter(p)
g = (k for k in p)
在I和g上有什么可以区分这两种结构的操作吗?一些我不能用g做的事情,诸如此类的事情。他们的类型是列表迭代器和生成器对象,但我不清
我有一个名为x的函数,它生成这样的生成器:
a = 5
def x():
global a
if a == 3:
raise Exception("Stop")
a = a - 1
yield a
然后,在python shell中,我像这样调用这个函数:
>>> print x().next()
>>> 4
>>> print x().next()
>>> 3
>>> print x().next()
>>> <py
在这些例子中,有人能解释发电机是如何工作的吗?
在本例中,来自
wwwlog = open("access-log")
bytecolumn = (line.rsplit(None,1)[1] for line in wwwlog)
bytes = (int(x) for x in bytecolumn if x != '-')
print "Total", sum(bytes)
当我们像这样的链式生成器时,除了代码对象创建之外,还有什么真正的工作发生在我们做sum()之前吗?
为什么我们需要分别做line.split(0,1)1和int
我知道python中的生成器在每次处理一个项目时至少是记忆有效的,但是这如何使时间有效(如果是的话)?
具体来说,假设我使用生成器函数一次加载一个数据,用于机器学习任务。最后,我仍然需要遍历所有的数据元素并一次加载它们(使用生成器函数)。是的,这是记忆效果,但这应该需要更多的时间来加载整个数据集,而不是一次加载。我的直觉对吗?
#sample_code
def my_gen():
for i in range(1000):
features = np.random.randn(32,32,3)
labels = np.random.randint(0,1, size
(这个问题基于一条现已删除的推特)
我使用Python3.9和Python3.10运行了下面的代码:
$ python -m timeit 'tuple([-x for x in range(1000)])'
10000 loops, best of 5: 35.7 usec per loop
$ python -m timeit 'tuple(-x for x in range(1000))'
5000 loops, best of 5: 45.7 usec per loop
令人惊讶的是,构造额外对象的版本(列表)更快。为什么是这种情况?如果这确实更快,那么
我经常发现写一个生成器比返回一个列表更干净。例如,我更喜欢
def my_func_gen(foo):
for i in foo:
# Do some stuff that's too complicated for a list or generator comprehension
yield whatever
至
def my_func_list(foo):
result = []
for i in foo:
# Do some stuff that's too complicated for a li
def city_generator():
print("city gen called")
return 1 # <--- over simplified to drive the point of the question
yield "amsterdam"
yield "los angeles"
>>> citygenobj = city_generator()
>>> print(citygenobj)
<generator object city_gen