让我们说我在python中有一个列表,如:
"ann"+"e"+"f"+"r"+"a"+"n"+"k"= annefrank
是否可以使用列表连接来有选择地添加列表的元素。例如,我添加了完整的element0,但是对于列表中的其他元素,我仅添加了最后一个字符(也仅当元素的长度为3时,我才添加了元素的最后一个字符)。因此字符串变为:
s = 'DOFLAMINGO WITH TOUCH SCREEN lorem ipsum'
alph = list(filter(str.isalpha, s)) # ['D', ..., 'O', 'W', ..., 'N', 'l', 'o', ...]
sum(map(str.isupper, alph)) / len(alph)
# 0.7142857142857143
未添加最后一个元素,因为其长度不为3。 我可以使用for循环解决此问题,但想知道是否有任何优化的pythonic方式来做到这一点或使用join。
谢谢您的期待。 友邦
答案 0 :(得分:0)
您可以建立列表中每个项目的第三个字母的列表:
mylist = ['ann', 'nne', 'nef', 'efr', 'fra', 'ran', 'ank', 'nk']
thirdletters = [ x[2:3] for x in mylist ]
(该新列表的最后一项将是一个空字符串,因为'nk'中没有第三个字母),然后使用join
将这些字母收集到一个字符串中,并使用一个空字符串作为填充符:< / p>
thirdstring = ''.join(thirdletters)
,最后在原始列表中第一项的前两个字母之后添加该字符串:
result = mylist[0][:2] + thirdstring
如果这太罗word了,您可以将所有内容合并为一个语句:
result = mylist[0][:2] + ''.join( [ x[2:3] for x in mylist ] )
答案 1 :(得分:0)
由于您有一定的要求,无论选择哪种范例,都需要应用一些自定义逻辑。
我将使用Python的功能工具来过滤序列:
import operator
import functools
seq = ['ann', 'nne', 'nef', 'efr', 'fra', 'ran', 'ank', 'nk']
functools.reduce(operator.add, (map(lambda x: x[-1], filter(lambda x: len(x)==3, seq[1:]))), seq[0])
# gives annefrank
内部filter
负责处理长度不为3的元素(列表中的第一个元素除外)。 map
将返回其最后一个字符,而reduce
将add
应用于它们,并将列表的第一个元素作为初始值。
如果您愿意,也可以使用join
来完成此操作:
seq[0]+''.join((map(lambda x: x[-1], filter(lambda x: len(x)==3, seq[1:]))))
# gives annefrank
您还可以将过滤器合并到地图中:
seq[0]+''.join((map(lambda x: x[-1] if len(x)==3 else '', seq[1:])))
如您所见,实现目标的方法有很多。但是,与循环遍历序列相比,我更喜欢map
和filter
,因为它们具有高度优化的实现。