我在 Python 3.4.3 中遇到了一个奇怪的问题,似乎没有任何地方提到它。
让我们说:
a = [1,2,3,4]和b = [5,6,7,8]
要垂直连接这些:ab = zip(a,b)
在 python 3 中,ab它本身将返回:
zip 对象位于(一些十六进制数)
一切都好,在python 3中,检索连接列表:
aabb = list(ab)
现在问题来了,第一次,aabb确实会返回一个真正的列表:
[(1, 5), (2, 6), (3, 7), (4, 8)]
然而,第二次及以后,如果你再次执行整个过程,list(aabb)只会返回一个空[]容器,就像list()会做的那样。
只有在我重新启动 shell/解释器后它才会再次工作。
这是正常现象还是bug?
编辑:玉家伙我并没有意识到这是一起做的zip,它似乎常数ab返回相同的十六进制值,每次所以我认为这是一起做的list(ab)。
无论如何,通过重新分配解决了 ab = zip(ab)
根据我在答案和原始链接中的理解,ab一旦阅读就会被处理掉。
我在python的内置csv模块中遇到过一个我以前从未注意过的行为.通常,当我在csv中读取时,它几乎逐字地遵循文档,使用"with"打开文件,然后使用"for"循环遍历reader对象.但是,我最近尝试连续两次迭代csv.reader对象,结果发现第二个'for'循环没有做任何事情.
import csv
with open('smallfriends.csv','rU') as csvfile:
readit = csv.reader(csvfile,delimiter=',')
for line in readit:
print line
for line in readit:
print 'foo'
Run Code Online (Sandbox Code Playgroud)
控制台输出:
Austins-iMac:Desktop austin$ python -i amy.py
['Amy', 'James', 'Nathan', 'Sara', 'Kayley', 'Alexis']
['James', 'Nathan', 'Tristan', 'Miles', 'Amy', 'Dave']
['Nathan', 'Amy', 'James', 'Tristan', 'Will', 'Zoey']
['Kayley', 'Amy', 'Alexis', 'Mikey', 'Sara', 'Baxter']
>>>
>>> readit
<_csv.reader object at 0x1023fa3d0>
>>>
Run Code Online (Sandbox Code Playgroud)
所以第二个'for'循环基本上什么也没做.我有一个想法是csv.reader对象在被读取一次后从内存中释放.但事实并非如此,因为它仍然保留了它的内存地址.我找到了一篇提到类似问题的帖子.他们给出的原因是,一旦读取了对象,指针就会停留在内存地址的末尾,准备将数据写入对象.它是否正确?有人可以详细了解这里发生了什么吗?有没有办法将指针推回到内存地址的开头重新读取?我知道这样做是不好的编码实践,但我主要只是好奇并希望更多地了解Python的内容.
谢谢!
结果是None用list(a)第二次.任何人都有这方面的线索?
>>> test = {1: 2, 3: 4}
>>> a= test.iterkeys()
>>> list(a)
**[1, 3]**
>>> list(a)
**[]**
>>> list(a)
[]
Run Code Online (Sandbox Code Playgroud) 我在将地图转换为列表时遇到问题,当它可以转换为设置时
list_nums_2 = [2, 4, 5, 9, 8, 7, 6, 3, 1, 0]
evens = filter(lambda a: a % 2 == 0, list_nums_2)
print(set(evens)) # Out: {0, 2, 4, 6, 8}
print(list(evens)) # Out: []
Run Code Online (Sandbox Code Playgroud)
我知道这不是因为它已经从下面转换为设置,很明显set可以转换为list
set_1 = {2, 3, 4, 5, 6}
print(list(set_1)) # Out: [2, 3, 4, 5, 6]
Run Code Online (Sandbox Code Playgroud) l=['Python', 3, 2, 4, 5, 'version']
l=filter(lambda x:type(x)==int,l)
print(list(l))
print(max(l))
Run Code Online (Sandbox Code Playgroud)
收到此错误,但我不知道为什么.. ValueError: max() arg 是一个空序列
如果我不打印 list(l) 它将起作用..
l=['Python', 3, 2, 4, 5, 'version']
l=filter(lambda x:type(x)==int,l)
print(max(l))
Run Code Online (Sandbox Code Playgroud)
输出:5
打印过滤器对象的列表后它不起作用,我不知道你为什么能帮我?任何修复?
我试图在python3中对codeeval进行挑战,并试图改进我的解决方案.每当我试图在同一个迭代器上连续两次迭代(或打印或其他动作)时,第二个循环就会变空.这是一个产生这种行为的最小例子,虽然我尝试了几个与列表等不同的组合,这给了我相同的结果:
numbers = ('1','2','3','4','5')
numbers = map(int, numbers)
print(list(numbers))
print(list(numbers))
Run Code Online (Sandbox Code Playgroud)
结果是:
[1, 2, 3, 4, 5]
[]
Run Code Online (Sandbox Code Playgroud)
为什么打印(在这种情况下)删除数字的内容?
我有一个zip对象:
L_RANGES = zip(range(10, 20), range(11, 21))
Run Code Online (Sandbox Code Playgroud)
第一次打电话L_RANGES是好的:
print(type(L_RANGES))
for a, b in L_RANGES:
print(a, b)
Run Code Online (Sandbox Code Playgroud)
输出:
<class 'zip'>
10 11
11 12
12 13
13 14
14 15
15 16
16 17
17 18
18 19
19 20
Run Code Online (Sandbox Code Playgroud)
接下来的电话不显示任何内容.有没有办法维护或重置它.到目前为止,我可以将其转换为列表:
L_RANGES = list(zip(range(10, 20), range(11, 21)))
Run Code Online (Sandbox Code Playgroud) 以下代码块有效,对我来说似乎相当合法。字符串中有TP两次TP Tutorials Point TP,因此匹配数应为 2。此外,对该列表的迭代也应该有效。
s = 'TP Tutorials Point TP'
out = re.findall(r'TP', s)
assert len(list(out)) == 2
# this loop will print 2 times matched string
for m in out:
print(m)
Run Code Online (Sandbox Code Playgroud)
但这是怎么回事?
s = 'TP Tutorials Point TP'
out = re.finditer(r'TP', s)
# seems OK so far
assert len(list(out)) == 2
# !!! no output here !!!
for m in out:
print(m)
Run Code Online (Sandbox Code Playgroud)
为什么我无法迭代finditer方法的返回输出?在下一篇文章中表明,这finditer也应该有效。我的Python版本:3.8.10
我遇到了一些从Dynamo数据库中获取迭代对象的代码,我可以这样做:
print [en["student_id"] for en in enrollments]
Run Code Online (Sandbox Code Playgroud)
但是,当我再次做类似的事情时:
print [en["course_id"] for en in enrollments]
Run Code Online (Sandbox Code Playgroud)
然后第二次迭代将不打印任何内容,因为迭代结构只能迭代一次并且它已经到达终点.
问题是,我们怎样才能多次迭代它,对于(1)如果已知只是迭代中的几个项目(2)如果我们知道会有很多项目(比如一百万)怎么办?项目)在迭代中,我们不想花费大量额外的内存空间?
相关的是,我查了一下rewind,它似乎存在于PHP和Ruby中,但不适用于Python?
我想学习zip类的功能.我写了这个非常简单的例子.
>>> names = ['name1','name2','name3']
>>> ages = ['age1','age2','age3']
>>> print(zip(names, ages))
<zip object at 0x03DB18F0>
>>> zipped = zip(names, ages)
for i in zipped:
type(i)
print(i)
Run Code Online (Sandbox Code Playgroud)
和输出(如预期的那样) -
<class 'tuple'>
('name1', 'age1')
<class 'tuple'>
('name2', 'age2')
<class 'tuple'>
('name3', 'age3')
Run Code Online (Sandbox Code Playgroud)
但是,如果我这样写,请立即在此行后:
for i in zipped:
print(i)
Run Code Online (Sandbox Code Playgroud)
它编译但没有打印任何东西!
要重新检查,我再次这样做了 -
>>> zipped = zip(names, ages)
>>> for i in zipped:
print(i)
('name1', 'age1')
('name2', 'age2')
('name3', 'age3')
Run Code Online (Sandbox Code Playgroud)
这次打印正确.但是在做解压缩时 -
>>> names2, ages2 = zip(*zipped)
Traceback (most recent call last):
File …Run Code Online (Sandbox Code Playgroud) 发电机一旦使用过一次,就无法再次使用。为什么是这样?
考虑以下代码:
def generator(n):
a = 1
for _ in range(n):
yield a
a += 1
def run_generator(generator):
for a in generator:
print(a, end = " ")
Run Code Online (Sandbox Code Playgroud)
如果我要执行这个:
count_generator = generator(10)
run_generator(count_generator)
run_generator(count_generator)
Run Code Online (Sandbox Code Playgroud)
它只会打印:
1 2 3 4 5 6 7 8 9 10
Run Code Online (Sandbox Code Playgroud)
基本上,生成器在执行一次后就会死亡。
我知道生成器只能使用一次这一事实是 Python 内置的东西,但为什么会这样呢?是否有特定原因只允许生成器对象执行一次?