相关疑难解决方法(0)

可以在Python中重置迭代器吗?

我可以在Python中重置迭代器/生成器吗?我正在使用DictReader并希望将其重置(从csv模块)到文件的开头.

python iterator generator

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

如何在Python生成器中展望一个元素?

我无法弄清楚如何在Python生成器中展望一个元素.一看,它就消失了.

这就是我的意思:

gen = iter([1,2,3])
next_value = gen.next()  # okay, I looked forward and see that next_value = 1
# but now:
list(gen)  # is [2, 3]  -- the first value is gone!
Run Code Online (Sandbox Code Playgroud)

这是一个更实际的例子:

gen = element_generator()
if gen.next_value() == 'STOP':
  quit_application()
else:
  process(gen.next())
Run Code Online (Sandbox Code Playgroud)

任何人都可以帮我写一个发电机,你可以看一个元素前进吗?

python generator peek

68
推荐指数
8
解决办法
3万
查看次数

如何克隆Python生成器对象?

考虑这种情况:

#!/usr/bin/env python
# -*- coding: utf-8 -*-
import os

walk = os.walk('/home')

for root, dirs, files in walk:
    for pathname in dirs+files:
        print os.path.join(root, pathname)

for root, dirs, files in walk:
    for pathname in dirs+files:
        print os.path.join(root, pathname)

我知道这个例子有点多余,但您应该考虑我们需要walk多次使用相同的数据.我有一个基准测试场景,必须使用相同的walk数据才能获得有用的结果.

我试图walk2 = walk在第二次迭代中克隆并使用,但它没有用.问题是......我怎么能复制它?它有可能吗?

先感谢您.

python clone generator object

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

为什么我不能在同一数据上迭代两次?

老实说,我在这里有点困惑,为什么我不能在相同的数据上迭代两次?

def _view(self,dbName):
    db = self.dictDatabases[dbName]
    data = db[3]

    for row in data:
        print("doing this one time")

    for row in data:
        print("doing this two times")
Run Code Online (Sandbox Code Playgroud)

这将打印出"一次这样做"几次(因为数据有几行),但它根本不会打印出"这样做两次"......

我第一次迭代数据工作正常,但第二次当我运行最后一个列表"for data in data"时,这没有返回...所以执行它一次工作但不是两次......?

仅供参考 - 数据是一个csv.reader对象(如果是这样的原因)......

python

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

确保一个参数可以迭代两次

假设我有以下函数:

def print_twice(x):
    for i in x: print(i)
    for i in x: print(i)
Run Code Online (Sandbox Code Playgroud)

当我跑步时:

print_twice([1,2,3])
Run Code Online (Sandbox Code Playgroud)

或者:

print_twice((1,2,3))
Run Code Online (Sandbox Code Playgroud)

我得到了预期的结果:数字 1,2,3 被打印两次。

但是当我跑步时:

print_twice(zip([1,2,3],[4,5,6]))
Run Code Online (Sandbox Code Playgroud)

(1,4),(2,5),(3,6) 对仅打印一次。可能这是因为zip返回一个在一次传递后终止的生成器。

如何修改该函数print_twice以使其正确处理所有输入?

我可以在函数的开头插入一行:x = list(x)。但如果 x 已经是列表、元组、范围或任何其他可以迭代多次的迭代器,这可能会效率低下。有更有效的解决方案吗?

python

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

Python 3.6:islice 的异步版本?

我正在尝试做这样的事情:

import asyncio
from itertools import islice

async def generate_numbers(n):
    for x in range(n):
        yield x


async def consume_numbers(n):
    async for x in generate_numbers(n):
        print(x)

async def consume_some_numbers(n,m):
    async for x in islice(generate_numbers(n),m): #<-- This doesn't work.  islice doesn't recognize async iterators as iterators.
        print(x)


loop = asyncio.get_event_loop()
loop.run_until_complete(consume_numbers(10))
loop.run_until_complete(consume_some_numbers(10,5))
Run Code Online (Sandbox Code Playgroud)

有没有办法让这个工作,或者至少获得类似的功能?

iterator python-itertools python-asyncio python-3.6

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

Python嵌套生成器无法正常工作

我正在练习发电机,我想知道为什么以下代码不打印16对但只有4对.

def range_generator_function(my_range):
    for i in my_range:
        yield i

gen1=range_generator_function(range(1,5))
gen2=range_generator_function(range(1,5))

def pairs_generator_function(gen1,gen2):
    for it1 in gen1:
        for it2 in gen2:
            yield [it1,it2]

my_gen = pairs_generator_function(gen1,gen2)

for it in my_gen:
    print(it)
Run Code Online (Sandbox Code Playgroud)

输出是

[1, 1]
[1, 2]
[1, 3]
[1, 4]
Run Code Online (Sandbox Code Playgroud)

虽然我期望的输出是

[1, 1]
[1, 2]
[1, 3]
[1, 4]
[2, 1]
[2, 2]
[2, 3]
[2, 4]
[3, 1]
[3, 2]
[3, 3]
[3, 4]
[4, 1]
[4, 2]
[4, 3]
[4, 4]
Run Code Online (Sandbox Code Playgroud)

python generator

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

for循环不执行两次

我是python的新手,我正在学习lambda和map,但是当我尝试一些东西时,我发现一个循环没有执行,我想知道原因.

我知道这样做是没用的,但是当我迭代同一个列表两次时,第二次没有被执行.

salarios = map(lambda emp: emp.salario, empleados)
print("------SALARIO-------")
for salario in salarios:
    print(salario)
print("-----SALARIO2--------")
for salario in salarios:
    print(salario)
Run Code Online (Sandbox Code Playgroud)

我明白了

------SALARIO-------
6700
7500
2100
2150
1800
-----SALARIO2--------

我希望得到

------SALARIO-------
6700
7500
2100
2150
1800
-----SALARIO2--------
6700
7500
2100
2150
1800

它为什么会发生?这是一些lenguaje优化?

python arrays for-loop python-3.x

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

如果索引&gt; len(list),如何按索引循环遍历列表并从头开始?

精华:

对于像 的列表['A', 'B', 'C'],我试图构建或找到一个函数,该函数将在每次调用时返回列表的下一个元素。在这种情况下,如果它被调用超过 3 次,A则将被返回。在那之后B等等。


详细信息和我尝试过的内容:

我有一个['A', 'B', 'C']要应用于不同对象的颜色列表。每次运行代码时,对象的数量可能会有所不同。如果列表中的对象多于颜色,我希望第四个对象具有 color 'A'。所以,正如标题所说,我想遍历一个列表 by 和 index 并从头开始 if index > len(list)。以下自定义函数looper将做到这一点。

def looper(lst, runs):
    j = 0
    for i in range(0, (len(lst)+(runs-(len(lst))))):
        if i < len(lst):
            print(lst[i])
        else:
            print(lst[j])
            j +=1
Run Code Online (Sandbox Code Playgroud)

测试 1

# input:
runs = 2
looper(['A', 'B', 'C'], runs)

# output:
A
B
Run Code Online (Sandbox Code Playgroud)

测试 2

#input :
runs = 5
looper(['A', 'B', 'C'], runs)

#output …
Run Code Online (Sandbox Code Playgroud)

python

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

为什么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
查看次数