相关疑难解决方法(0)

python list(zipobject) 返回空(列表)容器

我在 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 list

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

不了解Python的csv.reader对象

我在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的内容.

谢谢!

python memory csv pointers object

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

为什么list()与对象分别显示不同的结果?

结果是Nonelist(a)第二次.任何人都有这方面的线索?

>>> test = {1: 2, 3: 4}
>>> a= test.iterkeys()
>>> list(a)
**[1, 3]**
>>> list(a)
**[]**
>>> list(a)
[]
Run Code Online (Sandbox Code Playgroud)

python list

3
推荐指数
1
解决办法
53
查看次数

Python:为什么我无法将地图对象转换为列表

我在将地图转换为列表时遇到问题,当它可以转换为设置时

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)

python python-3.x

3
推荐指数
1
解决办法
333
查看次数

为什么我收到值错误?

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

打印过滤器对象的列表后它不起作用,我不知道你为什么能帮我?任何修复?

python

3
推荐指数
1
解决办法
57
查看次数

对它执行某些操作后,Python迭代器为空

我试图在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)

为什么打印(在这种情况下)删除数字的内容?

python python-3.x

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

在python 3中重用zip迭代器

我有一个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)

python iterator python-3.x

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

re.finditer 有一定的长度,但我无法迭代它

以下代码块有效,对我来说似乎相当合法。字符串中有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

python python-re

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

在Python中,如何为迭代对象多次迭代?

我遇到了一些从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?

python

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

Python zip对象只能使用一次.这是为什么?

我想学习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)

python iterator

0
推荐指数
1
解决办法
1232
查看次数

为什么Python生成器只能使用一次?

发电机一旦使用过一次,就无法再次使用。为什么是这样?

考虑以下代码:

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 内置的东西,但为什么会这样呢?是否有特定原因只允许生成器对象执行一次?

python generator

-1
推荐指数
1
解决办法
1982
查看次数

标签 统计

python ×11

python-3.x ×3

iterator ×2

list ×2

csv ×1

generator ×1

memory ×1

object ×1

pointers ×1

python-re ×1