2017-04-10 48 views
0

一個條件的Python合併列表元素我有這樣的列表:在有些複雜方式

l=['abcdef', 'abcdt', 'neft', 'ryr', 'yyyyy', 'u', 'aaaaaaaaaa'] 

和,在上述列表中的每個元件的長度是分別6,5,4,3,5,1,10

我希望以一種滿足條件的方式組合它:新創建列表中的每個元素應該是至少長度爲10,這意味着,考慮下一個元素的組合,直到期望長度爲到達。空間將在每個加入點添加。

因此,列表現在變成了:

l=['abcdef abcdt', 'neft ryr yyyyy', 'u aaaaaaaaaa'] 

我試圖基於迭代和其它方法,但似乎沒有任何工作結合它了。有什麼建議麼?

+4

發佈您嘗試過的代碼。此外,它看起來像'l'是一個字符串列表,但你的例子不包括引號。請添加引號以清楚說明'l'的元素是什麼。 – Craig

+2

只要'l = [''.join(l)]''。滿足條件(如果有什麼辦法可以滿足它的話)。 –

+1

如果列表中不包含「aaaaaaaaaa」,結果會是什麼? 「u''會被忽略嗎? –

回答

3

你可以使用一個發電機,只要長度要求不被滿足從迭代需要的物品:

def join_while_too_short(it, length): 
    it = iter(it) 
    while True: 
     current = next(it) 
     while len(current) < length: 
      current += ' ' + next(it) 
     yield current 

當您輸入運行此它產生正確的結果:

>>> l = ['abcdef', 'abcdt', 'neft', 'ryr', 'yyyyy', 'u', 'aaaaaaaaaa'] 
>>> list(join_while_too_short(l, 10)) 
['abcdef abcdt', 'neft ryr yyyyy', 'u aaaaaaaaaa'] 

它不會很有效率,因爲它不斷地格式化字符串,你也可以收集它們作爲列表,並在產生之前加入它們,但是這個版本應該更清楚地說明原理。


注意,要求可能並不總是被滿足,因爲可能沒有足夠的項目在年底創建所需長度的字符串。然而,你說你想「考慮下一個元素的組合,直到達到期望長度」。所提出的方法就是這樣做的。

+0

如果你想清除*和*效率,你可以使用'nxt + =''+ next(it)'。 –

+0

@StefanPochmann你可能是對的。我也喜歡你'[''.join(l)]'的建議。 :) – MSeifert

+1

您編輯的代碼不起作用。並且'current = current +''+ next(it)'不會從'current + =''+ next(it)'具有的優化中受益。試着用'timeit(lambda:list(join_while_too_short(['a'] * 800000,800000)),number = 1)''來測試。我的版本爲62秒,我的版本爲0.3秒。 –

1

只要運行一次並追加,直到達到條件應該可以正常工作。據我所知,你不能列出你的方式列入多行操作,但如果Pandas是一個選項,讓我們通過編輯你的問題來告訴我們。熊貓數據框移位方法可讓您在lambda函數中一次檢查多行,並以非for循環方式解決此問題。

l=[ 'abcdef', 'abcdt', 'neft', 'ryr', 'yyyyy', 'u', 'aaaaaaaaaa' ] 

newlist = list() 
newitem = '' 
for item in l: 
    if len(newitem) == 0: 
     newitem = item 
    else: 
     newitem = newitem +" "+ item 
    if len(newitem) > 9: 
     newlist.append(newitem) 
     newitem='' 

if len(newitem)>0: # grab any left over stuff that was <10 digits at the end 
    newlist.append(newitem) 

print (newlist) 

運行的Python 3.6 jupyter輸出如您所願

[ 'ABCDEF abcdt', '天然氣工業石油公司蘭尼yyyyy的', 'U AAAAAAAAAA']

0

這應該工作,請注意,列表已被修改,如果您不想要,請先複製一份。測試你給的情況。

def combine(a, n): 
    i = 0 
    while i < len(a): 
     if len(a[i]) >= n: 
      i += 1 
     elif i + 1 < len(a): 
      a[i:i + 2] = [a[i] + " " + a[i + 1]] 
     elif len(a) > 1: 
      a[i - 1:i + 1] = [a[i - 1] + " " + a[i]] 
      break 
     else: 
      break