python选择性连接列表以获取字符串

时间:2018-11-21 16:31:43

标签: python-3.x list

让我们说我在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。

谢谢您的期待。 友邦

2 个答案:

答案 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将返回其最后一个字符,而reduceadd应用于它们,并将列表的第一个元素作为初始值。

如果您愿意,也可以使用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:])))

如您所见,实现目标的方法有很多。但是,与循环遍历序列相比,我更喜欢mapfilter,因为它们具有高度优化的实现。