एक सूची के तत्वों को जोड़ना अगर उन तत्वों को दो व्हाट्सएप के बीच में है


24

मेरे पास इस तरह का एक इनपुट है:

['assembly', '', 'py', 'tho', 'n', '', 'ja', 'va', '', 'rub', 'y', '', 'java', 'script', '', 'c++']

मैं ''इस तरह से आउटपुट के बीच तत्वों को जोड़ना चाहता हूं :

['assembly', 'python', 'java', 'ruby', 'javascript', 'c++']

मैंने joinइस तरह से स्लाइसिंग का उपयोग करने और सूचीबद्ध करने की कोशिश की :

a=['assembly', '', 'py', 'tho', 'n', '', 'ja', 'va', '', 'rub', 'y', '', 'java', 'script', '', 'c++']
a[2:5] = [''.join(a[ 2: 5])]
a=['assembly', '', 'python', '', 'ja', 'va', '', 'rub', 'y', '', 'java', 'script', '', 'c++']

यह कुछ हद तक काम करता है, लेकिन मुझे नहीं पता कि इस निर्देश को पूरी सूची के लिए कैसे बनाया जाए।

जवाबों:


27

का उपयोग कर itertools.groupby:

from itertools import groupby

l = ['assembly', '', 'py', 'tho', 'n', '', 'ja', 'va', '', 'rub', 'y', '', 'java', 'script', '', 'c++']
new_l = [''.join(g) for k, g in groupby(l, key = bool) if k]

आउटपुट:

['assembly', 'python', 'java', 'ruby', 'javascript', 'c++']

2
स्पष्टीकरण: यह "फाल्सी" मान के लिए जाँच करने के लिए "बूल" का उपयोग करता है, जैसे रिक्त स्ट्रिंग या कोई नहीं।
दोपहर ɥʇʎԀʎ

7

यह भयावह और हैकरी है, लेकिन

lambda b:lambda l:''.join(i or b for i in l).split(b)

कोई भी स्ट्रिंग ले सकते हैं जिसकी आप गारंटी दे सकते हैं कि वह सूची में शामिल नहीं है, और जो आप चाहते हैं वह एक फ़ंक्शन लौटाएं। बेशक, आप शायद अपनी विशिष्ट स्थिति के लिए केवल एक या दो बार इसका उपयोग करना चाहते हैं, इसलिए, यदि आप यह गारंटी दे सकते हैं कि सूची के किसी भी तत्व में कोई स्थान नहीं है, तो यह अधिक दिख सकता है:

a = ['assembly', '', 'py', 'tho', 'n', '', 'ja', 'va', '', 'rub', 'y', '', 'java', 'script', '', 'c++']
a = ''.join(i or ' ' for i in a).split(' ')

4

यदि आप इटर्लूल का उपयोग नहीं करना चाहते हैं या नहीं कर सकते हैं:

l = ['assembly', '', 'py', 'tho', 'n', '', 'ja', 'va', '', 'rub', 'y', '', 'java', 'script', '', 'c++']
l_new = []
combined = ""
for idx, s in enumerate(l):
    if s != "":
        combined += s
        if idx == len(l)-1:
            l_new.append(combined)

    else:
        l_new.append(combined)
        combined = ""

3

तुम यह केर सकते हो:

a = ['assembly', '', 'py', 'tho', 'n', '', 'ja', 'va', '', 'rub', 'y', '', 'java', 'script', '', 'c++']
indx = ['' == k for k in a]
indx = [i for i, x in enumerate(indx) if x] # get the indices.
a_merged = a[0:indx[0]] + [''.join(a[indx[i]:indx[i+1]]) for i in range(len(indx)) if i < len(indx)-1] + a[indx[-1]+1:] # merge the list

आउटपुट:

['assembly', 'python', 'java', 'ruby', 'javascript', 'c++']

टिप्पणियों के बाद संपादित करें:

a = ['assembly', '','',  'py', 'tho', 'n', '', 'ja', 'va', '', 'rub', 'y', '', 'java', 'script', '', 'c++']
indx = [i for i, x in enumerate(a) if x == ''] # get the indices where '' occurs in the original list. 
a_merged = a[0:indx[0]] + [''.join(a[indx[i]:indx[i+1]]) for i in range(len(indx)) if i < len(indx)-1 and indx[i+1] -indx[i] > 1] + a[indx[-1]+1:]
a_merged

आउटपुट:

['assembly', 'python', 'java', 'ruby', 'javascript', 'c++']

# get the indices.बहुत उपयोगी टिप्पणी नहीं है। मेरा सुझाव है कि आप इसे या तो उपयोगी (उदाहरण के लिए filter the indices to keep only those that correspond to whitespace) बनाएं , या इसे पूरी तरह से हटा दें।
अलेक्जेंडर -

इसके अलावा, क्या 2 चरण की प्रक्रिया को सरल नहीं किया जा सकता है indices = [i for s in a if s == '']?
अलेक्जेंडर - मोनिका

@Alexander मुझे लगता है कि लाइन 2 के लिए आपका सुझाव एक वाक्यविन्यास त्रुटि होगी। लाइन 2 को हटाया जा सकता है यदि आप बस "नल स्ट्रिंग के बराबर है" चेक को लाइन तीन की तरह चेक करते हैंindx = [i for i, x in enumerate(a) if x == '']
Reimus Klinsman

दुर्भाग्य से, यह उत्तर पहले या अंतिम तत्व के कुछ होने का हिसाब नहीं देता है, जो इसमें शामिल होना चाहिए। की तरह a = ['asse','mbly', '', 'py', 'tho', 'n', '', 'ja', 'va', '', 'rub', 'y', '', 'java', 'script', '', 'c+', '+']लेकिन ऐसा लगता है आप के सिरों पर एक अशक्त तार के साथ एक सूची जोड़कर अपनी लाइन 3 सुधार सकता है लग रहा है एक enumerate([''] + a + [''])तो दूर करने a[0:indx[0]]और a[indx[-1]+1:]अपनी लाइन 4. पर यह अभी भी अगर वहाँ दो अशक्त तार सही eachother करने के लिए बगल में हैं के लिए खाते में नहीं है हालांकि
रीमस क्लिंसमैन 23

1
धन्यवाद @KeiNagase ठीक टिप्पणी के लिए। संपादन देखें।
भोले

2

यदि इनपुट डेलिमिटर वास्तव में खाली तार हैं, तो आप कर सकते हैं

strlist = [x or ' ' for x in a]
joined = ''.join(strlist).split()
joined
['assembly', 'python', 'java', 'ruby', 'javascript', 'c++']

क्षमा करें, असंबंधित स्ट्रिंग के उत्तर को नहीं देखा। यदि आप एक पैरामीटर के बिना विभाजित () करते हैं, तो यह सभी व्हाट्सएप को ध्वस्त कर देगा, जो थोड़ा अधिक मजबूत है।
realgeek

1

बहुत पुराना है, लेकिन अभी भी उपयोगी है:

from itertools import groupby

lst = ['assembly', '', 'py', 'tho', 'n', '', 'ja', 'va', '', 'rub', 'y', '', 'java', 'script', '', 'c++']

new_lst = [''.join(values)
           for key, values in groupby(lst, key = lambda x: x == '')
           if not key]
print(new_lst)

यह प्रदान करता है

['assembly', 'python', 'java', 'ruby', 'javascript', 'c++']

1

लूप के
अंदर सूची पर एक लूप चलाएं तत्व को एक अस्थायी खाली स्ट्रिंग में जोड़ें और इस स्थिति की जांच करें कि क्या तत्व खाली स्ट्रिंग है या सूची का अंतिम तत्व है, यदि सही है तो अस्थायी चर को आउटपुट सूची में जोड़ें और मूल्य बदलें एक खाली स्ट्रिंग कोड के लिए उस चर की
:

x=['assembly', '', 'py', 'tho', 'n', '', 'ja', 'va', '', 'rub', 'y', '', 'java', 'script', '', 'c++']
temp=''
output=[]
for y in x:
    temp=temp+y
    if y=='' or y==x[-1]:
        output.append(temp)
        temp=''

print(output)

आउटपुट: ['assembly', 'python', 'java', 'ruby', 'javascript', 'c++']


1

मैं इस बात से सहमत हूँ कि क्राइस उत्तर अधिकांश अजगर दृष्टिकोण का उपयोग करता है , लेकिन क्राइस उत्तर को थोड़ा सा अनुकूलित करना अच्छा होगा । इसके बजाय उपयोग groupby(l,key = bool)करने के लिए उपयोग करें groupby(l, key = lambda x: x !='')और अनावश्यक अस्पष्टता से छुटकारा पाएं

from itertools import groupby

separator = ''
l = ['assembly', '', 'py', 'tho', 'n', '', 'ja', 'va', '', 'rub', 'y', '', 'java', 'script', '', 'c++']
new_l = [''.join(g) for k, g in groupby(l, key = lambda x: x !=separator) if k]

जैसा कि द ज़ेन ऑफ पायथन में कहा गया है : स्पष्ट रूप से निहितार्थ से बेहतर है

PS मैं केवल नया उत्तर लिख रहा हूं क्योंकि क्राइस उत्तर पर टिप्पणी लिखने के लिए मेरे पास पर्याप्त प्रतिष्ठा नहीं है ।


1

केवल मूल छोरों / परीक्षणों के साथ एक और कार्यशील संस्करण:

txt = ['assembly', '', 'py', 'tho', 'n', '', 'ja', 'va', '', 'rub', 'y', '', 'java', 'script', '', 'c++']

out = []
temp = ''

for s in txt:
   if s == '':
      if temp != '':
         out.append(temp) 
         temp = ''
      out.append('')
   else:
      temp = temp + s

if temp != '':
   out.append(temp)

out
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.