2017-04-06 9 views
6

तो में सूची तत्वों में शामिल होने, मैं इस सूचीअजगर एक मुश्किल रास्ता

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

है और है, मैं उन्हें एक तरह से शामिल करना चाहते हैं जैसे:

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

मैं तरीकों की बहुत सारी की कोशिश की लेकिन कुछ भी काम नहीं लग रहा था। कोई सुझाव?

+0

तो रिक्त स्ट्रिंग शामिल नहीं हुए किया जाना चाहिए? –

+1

क्या आप सूची में खाली स्ट्रिंग के बीच तत्व चाहते हैं? – Surajano

+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

बस सही ..! –

+0

आप लैम्ब्डा को 'बूल' द्वारा प्रतिस्थापित करके (और इसे तेज करें) को सरल बना सकते हैं, और आंतरिक लूप में परीक्षण को उलट कर सकते हैं: 'r = [j के लिए j, j में समूह (एल, बूल) में जी ([ ''। जॉइन (जी)] अगर के और जी)] '। 'बूल' को सी में कार्यान्वित किया गया है, इसलिए यह एक पायथन फ़ंक्शन (लैम्ब्डा) को कॉल करने से तेज़ हो सकता है। –

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'] 
4

यहाँ एक और है समझ के पीछे त्रिगुट ऑपरेटर क्या प्रत्येक समूह के लिए क्या करने के लिए तय करने के लिए समूह कुंजी का उपयोग करता संस्करण पुराने सूची का उपयोग करते हुए सूची को संपादित करने के लिए:

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'] 
+1

मैं इसका भुगतान करूंगा, हालांकि स्रोत सूची _may_ को म्यूट करना वांछनीय नहीं है, लेकिन मुझे लगता है कि यह ठीक है, क्योंकि ओपी संशोधित सूची को 'l' पर वापस असाइन कर रहा है। –

1

सूची समझ के साथ लैम्ब्डा कार्यों का उपयोग किए बिना यो आप सूचियों के माध्यम से बस इसे पुराने फैशन तरीके से कर सकते हैं।

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 
+0

यदि पंक्ति में दो से अधिक शब्द हैं, उदाहरण के लिए, 'l = [' abc ',' retro ',' ',' ',' images ',' are ',' cool ', यह बहुत अच्छा काम नहीं करता है, , '', 'end'] ', या यदि' l' एक खाली स्ट्रिंग में समाप्त होता है। –

+0

हाँ आप सही हैं, पाइथन में इटरेटर के बारे में भी भूल गए हैं। एक अन्य समाधान – Ilhicas

+0

के साथ पोस्ट अपडेट करेगा नया संस्करण बेहतर है, लेकिन इसमें अभी भी कुछ समस्याएं हैं। यह अतिरिक्त खाली तार जोड़ता है, और यह सूची के अंत को ठीक तरह से संभाल नहीं करता है। यदि आप पिछला: परिणाम.एपेंड (पिछला) ',' result.append (पिछला) '' 'बदलकर इसे ठीक कर सकते हैं, तो परिणामस्वरूप 'परिणाम .append (पिछला)', और 'result.append (current)' को प्रतिस्थापित करें, यदि पिछले: परिणाम.एपेंड (पिछला) 'भी । साथ ही, '.pop (0) 'ver अक्षम है क्योंकि सभी बाद की सूची आइटम को हटाए जाने के बाद नीचे ले जाना होगा। वर्तमान में एल के लिए 'करना बेहतर है: ' –

1

यहाँ एक और groupby तरीका है का उपयोग कर एक और सामान्य दृष्टिकोण है। यह एक सूची कंप का उपयोग नहीं करता है, लेकिन मुझे लगता है कि यह थोड़ा और पठनीय बनाता है। ;) और अन्य (वर्तमान) उत्तरों के विपरीत यह नेस्टेड लूप की बजाय एक लूप का उपयोग करता है (लूप के अलावा .join आंतरिक रूप से उपयोग करता है)।

हम मुख्य कार्य के रूप में bool का उपयोग करते हैं, इसलिए समूह या तो सत्य-ईश या झूठी-आश हैं। एक झूठा-आश समूह खाली तारों का एक समूह है, इसलिए हम समूह के साथ आउटपुट सूची new का विस्तार करते हैं। एक सच्चे-आइश समूह में केवल गैर-खाली तार होते हैं, इसलिए हम इसमें शामिल होते हैं, और परिणाम को 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'] 
संबंधित मुद्दे