如何在';pythonic';路?
我有一个字符串列表。我需要为所有的字符串添加一个字符串,然后只为其中两个添加第二个字符串。我正在尝试以下方法:如何在';pythonic';路?,python,list,Python,List,我有一个字符串列表。我需要为所有的字符串添加一个字符串,然后只为其中两个添加第二个字符串。我正在尝试以下方法: [s + ' help ' for s in [ ['me '].extend(['with ' + t for t in ['things', 'please']]) ] ] ['me help ', 'with things help ', 'with please help '] 我所期望的是: [s + ' help ' for s in [ ['me '].extend(
[s + ' help ' for s in [ ['me '].extend(['with ' + t for t in ['things', 'please']]) ] ]
['me help ', 'with things help ', 'with please help ']
我所期望的是:
[s + ' help ' for s in [ ['me '].extend(['with ' + t for t in ['things', 'please']]) ] ]
['me help ', 'with things help ', 'with please help ']
当我尝试在iPython中运行此操作时,没有发生任何事情。在“新建”列表上使用extend方法似乎有问题。我不确定,而且对python还比较陌生
编辑:
更明确地说,在上述示例中,原始列表为:
['me', 'things', 'please']
我需要为所有这些添加“帮助”,并仅为后两个添加“with”
我在运行上述代码行时出错:
TypeError: unsupported operand type(s) for +: 'NoneType' and 'str'
第二次编辑:
我更关注元素的位置。我希望将一个字符串添加到列表的每个元素中,不包括第一个,然后将第二个字符串添加到整个新列表中。我上面的方法是第一次尝试它应该是什么(以最“pythonic”的方式),但它不起作用。我理解它为什么不起作用,但我不确定如何将上面的行改写成可以起作用的内容。如果它是基于字符串匹配的:
这将根据项目是否为me
创建字符串列表
产生:
['me help', 'with things help', 'with please help']
如果是位置性的:
如果您始终了解职位,这可能会有所帮助:
x = ['me', 'things', 'please']
word_pos = 1
['{} help'.format(i) for i in x[:word_pos]] + ['with {} help'.format(i) for i in x[word_pos:]]
产生:
['me help', 'with things help', 'with please help']
任何一个都可以是一行程序,但我强烈建议扩展这些程序,因为它们很快就会变得不可靠。除非您定义一个函数,该函数扩展列表并返回结果:
def lext(l, lx):
l.extend(lx)
return l
(python已经做到了这一点):
并以这种方式使用它:
[s + ' help ' for s in lext(['me '], ['with ' + t for t in ['things', 'please']])]
你必须一步一步地做:
inp = ['me', 'things', 'please']
out1 = [ s + ' help' for s in inp]
out2 = [ out1[0] ]
out2.extend(('with ' + s for s in out1[1:]))
欢迎来到程序和功能的奇妙世界,aka。命令和表达式:)这是一个可能的解决方案,可以完全实现您所编写的内容:
items = ['me', 'things', 'please']
new_items = []
for index, value in enumerate(items):
# Prepend to every item but the first
if i > 0:
v = "with %s" % v
# Append to every item
v = "%s help " % v
new_items.append(v)
print(new_items) # outputs: ['me help ', 'with things help ', 'with please help ']
这会将
帮助
附加到每一项,并在除第一项之外的每一项前面添加。我想我已经解决了这个问题。谢谢大家的帮助,但这正是(最简单的)我想要得到的:
[s + ' help ' for s in ['me '] + ['with ' + t for t in ['things', 'please']] ]
产生
['me help ', 'with things help ', 'with please help ']
这正是我需要用+替换的extend方法来连接列表。如果您想索引列表中的元素,可以使用以下方法:
s=['me', 'things', 'please']
['with ' + x + ' help' if x!=s[0] else x+' help' for x in s]
列表是静态长度,列表是什么?您还需要哪两个来添加第二个字符串?你得到的输出是什么?我不知道你所说的“静态”是什么意思。原始列表是动态的,需要添加静态的东西。不过我能应付。我只需要知道如何做这一部分。我的意思是静态的,列表的大小总是一样的。我想我的意思是,您总是在列表的最后两个元素中添加第二个字符串,还是总是添加第二个和第三个元素?您需要想出一些通用规则(特别是对于这个可选的添加)。根据什么标准,应包括可选脚本?在名单上的位置?列表中的原始值?还有什么?我正在将字符串添加到列表中的所有元素中,但第一个元素除外。大小(目前)是静态的,但我可以预见它是动态的。所以,我想保持它相对于原始列表的大小的动态性。我喜欢你的想法,是的,它会起作用。但我更关注元素在列表中的位置。好主意。谢谢。@lukehawk我不确定是否有可能以一种有效的方式对这一行进行索引。我只是假设你需要这个是因为语言上的原因(否则某些短语听起来会很糟糕)。如果没有其他人能想出更好的选择,我会看看我是否能发挥更大的魔力。谢谢你的尝试,是的,这是我所要求的关键。这似乎是一个相对简单的问题,像你这样的巫师应该有一个优雅的答案,但我对“pythonic”的方式非常缺乏经验,并且感到茫然。@lukehawk不完全确定这是否是pythonic。。在这种情况下,我会考虑扩展为“OF”循环。但我更新了我的答案,提出了一个既能定位又能处理if情况的解决方案。这就是将两个列表连接起来,并使用迭代器操作符格式化每个“一半”<代码>['{}help'。在x[:1]]+['with{}help]中为i设置格式(i)。在x[1:]
中为i设置格式(i)其中x
是您在第一次编辑中给出的字符串列表。因此,接受此答案。如果您需要担心空间问题,请查看itertools.chain(listone,listwo)
(例如)和生成器:(itertools.chain中s的s+帮助(('me',),('with'+t表示t in('things','please'))
。这将是一种有效的方法:)谢谢!我感谢你帮助我更接近这个目标。