我有一个值列表,我想为每个值附加一个字符串,但是,第一个值需要一个不同的字符串。所以给出一个清单,
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]]
答案 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(..)
来生成包含索引i
和name
的元组。如果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)
))