【问题标题】:How to enumerate from the middle of tuple [duplicate]如何从元组中间枚举[重复]
【发布时间】:2019-01-25 13:00:28
【问题描述】:

默认情况下,enumerate() 从 0 开始计数,但如果你给它第二个整数参数,它将从那个数字开始,但是我们如何从 count 和 elem 的特定值开始枚举。例如,我们想将 count 作为 '2' 和 elem 作为 'bar' 传递。两个值都必须传递给枚举函数。

elements = ('foo', 'bar', 'baz')
for count, elem in enumerate(elements):
    print (count, elem)

【问题讨论】:

  • @Georgy,我实际上并不认为这是一个好的目标。问题略有不同,这里不需要iter作为输入列表/元组,str.join不适用。

标签: python python-3.x enumerate


【解决方案1】:

您可以迭代数据的slice 并从特定整数开始枚举:

start_at = 1
elements = ('foo', 'bar', 'baz')
for count, elem in enumerate(elements[start_at:], start_at):
    print (count, elem)

输出:

1 bar
2 baz

文档:


编辑:

如果您使用的是不可切片的迭代器,则必须解决它:

start_at = 3   # first one included (0 based)
stop_at = 5    # last one (not included)

elements = ('foo', 'bar', 'baz', 'wuzz', 'fizz', 'fizzbuzz', 'wuzzfizzbuzz', 'foobarfuzzbizzwuzz')

# skip first few
it = iter(elements)
for _ in range(start_at):
    print("skipping: ", next(it))      # dont print, simply: next(it)

# enumerate the ones you want
i = start_at
for _ in range(stop_at-start_at):
    print(i,next(it))                 # you might need a try: except StopIteration:
    i+=1 

得到:

skipping:  foo
skipping:  bar
skipping:  baz
3 wuzz
4 fizz
5 fizzbuzz

【讨论】:

  • 感谢您的回复,我有一个类似 thisfor batch_id, batch_data in tqdm(enumerate(train_iter)): 的 for 循环,我想遍历 batch_id 和 batch_data 的特定值。你能给我建议一些解决方案吗?我从以前保存的值中获取的 batch_id 和 batch_data。
  • @aryan train_iter 是可迭代的吗?尝试在循环之外消耗前几个:for _ in range(5): next(train_iter) 跳过前 5 个 ...
  • 它实际上是来自 pytorch 的数据加载器,我正在尝试从以前保存的值开始训练迭代。
  • @aryan 查看编辑 - 不知道您的数据加载器,但这适用于迭代器
  • 其实在我的情况下,我只是想给batch_id和batch_data一个特定的值,这样枚举就会从那里开始。其中 batch_id 是 int 而 batch_data 是一个列表。
【解决方案2】:

itertools 模块是您想要以非标准方式进行迭代时应该查看的地方

在这种情况下使用islice

获取起始索引,使用容器的.index函数(或者如果你想从第二个位置迭代而不考虑内容,将其硬编码为1),结束索引是容器的len

for count, elem in enumerate(itertools.islice(elements, elements.index('bar'), len(elements))
    print(count, elem)

【讨论】:

    猜你喜欢
    • 2020-05-04
    • 1970-01-01
    • 2016-09-27
    • 2012-12-28
    • 2012-04-20
    • 1970-01-01
    • 2016-01-02
    • 1970-01-01
    • 2014-02-02
    相关资源
    最近更新 更多