将动态字符串附加到列表

时间:2018-02-14 18:34:38

标签: python

我有一个值列表,我想为每个值附加一个字符串,但是,第一个值需要一个不同的字符串。所以给出一个清单,

names = ['John', 'Jack', 'Kelly']

我怎样才能获得

'first comes John' 'then Jack' 'then Kelly'

我已经尝试过列表理解,但它没有按照我希望的方式工作。它最终做了else部分而完全忽略了if部分。

newnames = []
for i in range(0, len(names)):
    if i == 0:
        c = ['first comes %s'%s for s in names[i]]
    else:
        c = ['then %s'%s for s in names[i]]

3 个答案:

答案 0 :(得分:3)

我会建议:

["here comes " + names[0]] + ["then " + name for name in names[1:]]

它有效并且看起来足够可读。

答案 1 :(得分:2)

您可以将列表理解与enumerate()结合使用:

names = ['John', 'Jack', 'Kelly']

new_names = ['first comes {}'.format(name) 
    if idx == 0 else 'then {}'.format(name)
    for idx, name in enumerate(names)]

print(new_names)

这会产生

['first comes John', 'then Jack', 'then Kelly']

答案 2 :(得分:1)

可以在这里使用列表理解,但是你当前的程序只显示错误的算法。

i遍历names列表的 indices ,这意味着names[i]是单个名称(字符串)。因此,如果您编写for c in names[i]c将迭代单个名称的字符

让我们首先放弃列表理解的要求,并将其写成:

newnames = []
for i in range(0, len(names)):
    if i == 0:
        newnames.append('first comes %s' % names[i])
    else:
        newnames.append('then %s' % names[i])

我们append格式化的字符串为newnames并格式化names[i],而不是c

然而,我们可以将其转换为列表理解:

[('then %s' if i else 'first comes %s') % name for i, name in enumerate(names)]

我们这里做的是使用enumerate(..)来生成包含索引iname的元组。如果i真实性True(对于数字而言,为零,我们可以使用'then %s',否则我们使用'first comes %s'。我们使用name格式化该字符串。

我们可以通过删除每个元素的 if 来提高性能,并将其写成:

['first comes %s' % name for  name in names[:1]] \
    + ['then %s' % name for name in names[1:]]

这里我们使用names[:1]最多会产生一个元素,但优点是如果列表为空,我们就不会出错。

或者我们可以使用函数:

from itertools import chain, islice

result = list(chain(
                 map('first comes {}'.format, islice(names, 1),
                 map('then {}'.format, islice(names, 1, None)
              ))