তালিকার উপাদানগুলিতে যোগদান করা যদি সেই উপাদানগুলি দুটি সাদা জায়গার মধ্যে থাকে


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
ব্যাখ্যা: এটি একটি "ফালসি" মান যেমন খালি স্ট্রিং বা কোনও নয়, তা পরীক্ষা করতে "বুল" ব্যবহার করে।
noɥʇʎԀʎzɐɹƆ

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 == '']?
আলেকজান্ডার - মনিকা পুনরায়

@ আলেকজান্দার আমি মনে করি 2 লাইনের জন্য আপনার পরামর্শটি একটি সিনট্যাক্স ত্রুটি হবে। আপনি কেবল "সমান সমান নাল স্ট্রিং" তিনটি লাইনের জন্য চেক যুক্ত করলে লাইন 2 সরানো যেতে পারেindx = [i for i, x in enumerate(a) if x == '']
রেইমাস ক্লিনসমান

দুর্ভাগ্যক্রমে, এই উত্তরটি প্রথম বা শেষ উপাদানটির সাথে যোগ দেওয়া উচিত being মত a = ['asse','mbly', '', 'py', 'tho', 'n', '', 'ja', 'va', '', 'rub', 'y', '', 'java', 'script', '', 'c+', '+']তবে দেখে মনে হচ্ছে আপনি আপনার লাইন 3 টি উন্নত করতে পারবেন তার শেষে এবং আপনার লাইনের উপরের enumerate([''] + a + [''])অপসারণের শেষে নাল স্ট্রিং সহ একটি তালিকা যুক্ত করে each যদিওa[0:indx[0]]a[indx[-1]+1:]
রেইমাস ক্লিনসমান

1
ভাল মন্তব্য করার জন্য @ কেইনাগেস ধন্যবাদ। সম্পাদনা দেখুন।
নিষ্পাপ

2

যদি ইনপুট ডিলিমিটারগুলি আসলে খালি স্ট্রিং হয় তবে আপনি এটি করতে পারেন

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

দুঃখিত, নিরবিচ্ছিন্ন স্ট্রিংয়ের উত্তর দেখেনি। আপনি যদি কোনও প্যারামিটার ছাড়াই () বিভক্ত করেন তবে এটি সমস্ত সাদা স্থানকে ধসে পড়বে, যা কিছুটা দৃust়।
রিয়েলজেক

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]

যেমনটি পাইথনের দ্য জেন-এ বলা হয়েছে : স্পষ্ট বর্ণিত থেকে উত্তম

পিএস আমি কেবল নতুন উত্তরটি লিখছি কারণ ক্রিস উত্তরের উপর মন্তব্য লেখার মতো যথেষ্ট খ্যাতি আমার নেই ।


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
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.