所以,我有这个清单
// "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']
我尝试了很多方法但似乎没什么用。有什么建议吗?
答案 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.chain
和itertools.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']