【问题标题】:python how to efficiently cycle through few elements in a listpython如何有效地循环遍历列表中的几个元素
【发布时间】:2013-09-13 17:09:10
【问题描述】:

我有一个很长的列表,我想替换字符串。我在下面做了一个简化的例子来说明我的问题。

my_list = ['a7_1_1', 'a7_2_1', 'a7_3_1','a7_1_2', 'a7_2_2', 'a7_3_2','a7_1_3', 'a7_2_3', 'a7_3_3']


Out[12]:
['a7_1_1',
 'a7_2_1',
 'a7_3_1',
 'a7_1_2',
 'a7_2_2',
 'a7_3_2',
 'a7_1_3',
 'a7_2_3',
 'a7_3_3'

我想用添加到前 3 个字符串的后缀替换字符串,因此最终列表应如下所示:

my_new_list = ['a7_1_1', 'a7_2_1', 'a7_3_1','a7_1_1.1', 'a7_2_1.1', 'a7_3_1.1','a7_1_1.2', 'a7_2_1.2', 'a7_3_1.2']


Out[15]:
['a7_1_1',
 'a7_2_1',
 'a7_3_1',
 'a7_1_1.1',
 'a7_2_1.1',
 'a7_3_1.1',
 'a7_1_1.2',
 'a7_2_1.2',
 'a7_3_1.2']

有没有简单的方法可以做到这一点?

【问题讨论】:

  • 我建议重新措辞这个问题,使其更笼统(我想避免投票失败)。行中的东西:如何有效地循环遍历列表中的几个元素...

标签: python string list replace


【解决方案1】:

使用 itertools.cycle() 函数

import itertools as it           #1

def cycle_first_n(lst, n):
    """ cycles through first n elements of the list """
    c = it.cycle(lst[:n])        #2
    for idx in xrange(len(lst)): #3
        sfx = idx / n
        yield c.next() + ('.' + str(sfx) if sfx > 0 else '')  #4
  1. itertools 是一个用于创建迭代器的库 高效循环
  2. 创建一个迭代器来循环遍历 n 个元素的切片 列表
  3. 使用 xrange 而不是 range 以避免创建可能很长的 内存中的列表(见问题)
  4. yield 表示我们正在创建一个生成器。再次避免创建 内存中的长列表

如何使用该功能

lst = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h']
for o in cycle_first_n(lst, 3):
    print o,

输出

a b c a.1 b.1 c.1 a.2 b.2

【讨论】:

  • 关闭...我想保留前 3 个字符串,其余部分作为这些字符串的副本并添加后缀。所以保持 a7_1_1、a7_2_1 和 a7_3_1 不变。在您的解决方案中,只有 a7_1_1 在新列表中...
  • 奇怪,我得到了输出 ['a7_1_1', 'a7_2_1.1', 'a7_3_1.1', 'a7_1_1.1', 'a7_2_1.2', 'a7_3_1.2', ' a7_1_1.2'、'a7_2_1.3'、'a7_3_1.3']。我已经使用了你的数据..
  • 我对 python 不太熟悉。我收到错误消息 SyntaxError: 'return' outside function。您能否指导我如何让代码运行..
  • 只是缩进问题...代码工作正常!!!非常感谢你,你真的帮助了我!
  • 不客气!我删除了我的其他 cmets,因为它们不再适用。如果您需要对代码进行任何解释,请告诉我。
【解决方案2】:

我不太清楚你的意思。检查您是否要这样做:

>>> my_list = ['a7_1_1', 'a7_2_1', 'a7_3_1','a7_1_2', 'a7_2_2', 'a7_3_2','a7_1_3', 'a7_2_3', 'a7_3_3']
>>> my_new_list = sum([[x, x+'.1', x+'.2'] for x in my_list[:3]], [])
>>> print(my_new_list)
['a7_1_1', 'a7_1_1.1', 'a7_1_1.2', 'a7_2_1', 'a7_2_1.1', 'a7_2_1.2', 'a7_3_1', 'a7_3_1.1', 'a7_3_1.2']

【讨论】:

  • 是的,这就是我正在寻找的输出。但是我无法让您的代码正常工作。我收到一条错误消息:TypeError: cannot perform reduce with flexible type
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-09-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-07-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多