Python以一种棘手的方式加入列表元素

时间:2017-04-06 10:24:55

标签: python python-2.7 python-3.x

所以,我有这个清单

// "Prajeet Shrestha's" extension
extension NSMutableAttributedString {
    func bold(_ text:String) -> NSMutableAttributedString {
        let attrs:[String:AnyObject] = [NSFontAttributeName : UIFont(name: "AvenirNext-Medium", size: 12)!]
        let boldString = NSMutableAttributedString(string:"\(text)", attributes:attrs)
        self.append(boldString)
        return self
    }

    func normal(_ text:String)->NSMutableAttributedString {
        let normal =  NSAttributedString(string: text)
        self.append(normal)
        return self
    }
}

并且,我想以这样的方式加入他们:

l = ['abc', 'retro', '', '', 'images', 'cool', '', 'end']

我尝试了很多方法但似乎没什么用。有什么建议吗?

5 个答案:

答案 0 :(得分:6)

您可以使用itertools.groupby和列表理解。分组为''和非'',并使用str.join加入后者的项目。理解后面的三元运算符使用组密钥来决定为每个组做什么:

from itertools import groupby

l = ['abc','retro','','','images','cool','','end']

r = [j for k, g in groupby(l, lambda x: x=='') 
                          for j in (g if k else (' '.join(g),))]
print(r)
# ['abc retro', '', '', 'images cool', '', 'end']

答案 1 :(得分:4)

这是另一个使用旧的while循环来编辑列表的版本:

In [6]: l=['abc','retro','','','images','cool','','end']

In [7]: i = 1
   ...: while i < len(l):
   ...:     while l[i-1] and l[i]:
   ...:         l[i-1] += ' ' + l[i]
   ...:         del l[i]
   ...:     i += 1
   ...:

In [8]: l
Out[8]: ['abc retro', '', '', 'images cool', '', 'end']

答案 2 :(得分:1)

itertools.chainitertools.groupby()bool一起用作关键功能:

In [21]: from itertools import groupby, chain

In [22]: list(chain.from_iterable([' '.join(g)] if k else g for k, g in groupby(lst, bool)))
Out[22]: ['abc retro', '', '', 'images cool', '', 'end']

答案 3 :(得分:1)

如果不使用带有列表推导的lambda函数,你可以通过遍历列表来以旧的方式进行。

l=['abc','retro','','','images','cool','','end']

result = list()
for x in range(len(l)):
    if l[x]:
        #Its not empty lets move to next until we find one or more consecutive non empty elements
        for y in range(x+1, len(l)):
            if l[y]:
                result.append(l[x]+' '+l[y])
                x = y

            else:
                x = y
                break
    else:
        result.append(l[x])

    #We are going to append last element, because we might have read an empty before
    if x == len(l)-1:
        result.append(l[x])

print result

^^上面的解决方案不正确,只适合这种情况。

这是使用堆栈方法的另一种通用方法

l=['abc','retro','','','images','are','cool','','end']

result = list()
previous = ''
while l:
    current = l.pop(0)
    if current:
        if previous:
            previous+=' '+current
        else:
            previous = current
    else:
        result.append(previous)
        result.append('')
        previous = ''

result.append(current)
print result

答案 4 :(得分:1)

这是另一种groupby方法。它没有使用列表组件,但我认为这使它更具可读性。 ;)与其他(当前)答案不同,它使用单个循环而不是嵌套循环(除.join内部使用的循环外)。

我们使用bool作为关键函数,因此这些组是true-ish或false-ish。 false-ish组是一组空字符串,因此我们使用该组扩展输出列表new。 true-ish组仅包含非空字符串,因此我们将其加入,并将结果追加到new

from itertools import groupby

old = ['abc', 'retro', '', '', 'images', 'cool', '', 'end']

new = []
for k, g in groupby(old, key=bool):
    if k:
        new.append(' '.join(g))
    else:
        new.extend(g)

print(new)

<强>输出

['abc retro', '', '', 'images cool', '', 'end']