मेरे पास कई नेस्टेड सूचियों के साथ एक सूची है, यहां नमूना है:

temp_lst = [[None, None, None, None, None, None, None, '51', '51', '19'],
            [None, None, None, '55', '55', '55', '55', None, None, None],
            ['23', '23', '55', None, None, None, None, None, None, None]]

मैं इसे केवल एक सूची में मर्ज करना चाहता हूं, और मान एक विशिष्ट क्रम में होना चाहिए, परिणाम बिल्कुल इस तरह होना चाहिए:

           ['23', '23', '55', '55', '55', '55', '55', '51', '51', '19']

temp_lst के अंदर और भी सूचियां हो सकती हैं।

0
Angolababa 29 अप्रैल 2020, 14:04
क्या आप हमें इसे हल करने के लिए आपके द्वारा किए गए प्रयास को दिखा सकते हैं?
 – 
MM1
29 अप्रैल 2020, 14:41

6 जवाब

सबसे बढ़िया उत्तर

आप वास्तव में अपनी सूची को समतल नहीं कर रहे हैं, बल्कि इसके बजाय आप उप-सूची के अंदर प्रत्येक स्थिति से वह मान लेते हैं जो None नहीं है।

आप zip() का उपयोग करके अपनी सूचियों को स्थितिगत रूप से संयोजित कर सकते हैं और or वह मान प्राप्त करने के लिए जो None (या '' - जिसमें आपके पास कोई नहीं है):

# you keep the vaue on each position thats not None 
data =  [[None, None, None, None, None, None, None, '51', '51', '19'],
         [None, None, None, '55', '55', '55', '55', None, None, None],
         ['23', '23', '55', None, None, None, None, None, None, None]]
# wanted ['23', '23', '55', '55', '55', '55', '55', '51', '51', '19']

def coalesque(iterable, default):
    """Returns the first truthy value from iterable or default."""
    for x in iterable:
        if x: 
            return x
    return default

result = [ coalesque(n,'') for n in zip(*data)]  

print(result)

आउटपुट होगा:

['23', '23', '55', '55', '55', '55', '55', '51', '51', '19']

यह तब तक काम करता है जब तक आप यह सुनिश्चित कर सकते हैं कि:

  • सभी सूचियाँ समान लंबाई की हैं (अन्यथा itertools.zip_longest पर शोध करें)
  • "कॉलम" प्रति None केवल 1 तत्व नहीं है (केवल 1 का उपयोग किया जाता है)

यदि सभी मान एक "कॉलम" में गलत हैं, तो क्या लौटाया जाना चाहिए, यह परिभाषित करने के लिए default के लिए coalesque(iterable,default) का उपयोग करें।

देखो:

0
Patrick Artner 29 अप्रैल 2020, 14:33

आपको अपने मैट्रिक्स को स्थानांतरित करने और फिर संभावित उम्मीदवारों को फ़िल्टर करने की आवश्यकता है।

arr=[[None, None, None, None, None, None, None, '51', '51', '19'],
 [ None, None, None,'55', '55', '55', '55', None, None, None],
['23', '23', '55',None, None, None,None, None, None,None]]

ans=[]
for i in zip(*arr[::-1]):
    ans.append(list(filter(lambda x:x is not None, i))[0])
print(ans)
2
gautamits 29 अप्रैल 2020, 14:38
1
फ़िल्टर से सूची बनाना और उसके पहले तत्व का चयन करना थोड़ा बेकार है, अगर एक कॉलम में केवल None है तो यह क्रैश हो जाएगा। इनपुट सूची को उलटने की भी आवश्यकता नहीं है - इसे ध्यान में रखते हुए for i in zip(*arr): ans.append(filter(lambda x:x is not None, i)[0]) पर्याप्त होगा।
 – 
Patrick Artner
29 अप्रैल 2020, 14:46

ये कोशिश करें:

new_list = [n for sublist in original_list for n in sublist if n != None]

मूल रूप से मैं यहां जो करता हूं वह सूची समझ का उपयोग करता है।

1
Onilol 29 अप्रैल 2020, 14:08
इस सुझाव के लिए धन्यवाद, लेकिन मैं मूल्यों को उसी स्थिति में रखना चाहता हूं। सूचीबद्ध परिणाम की तरह, 23 अंतिम सूची में पहला होना चाहिए।
 – 
Angolababa
29 अप्रैल 2020, 14:15
बस सूची को my_list[::-1] के साथ उल्टा करें
 – 
Onilol
29 अप्रैल 2020, 14:19
यह एक "समतल" प्रोबेलम नहीं है - समाधान प्रत्येक सूची स्थिति पर नहीं- None मान लेता है और इसे रखता है, गैर को अनदेखा किया जाता है।
 – 
Patrick Artner
29 अप्रैल 2020, 14:22

ऐसा करने के लिए आप numpy का उपयोग कर सकते हैं। Numpy के साथ आप किसी भी आयाम की सूची को समतल करते हैं

import numpy as np
a  = [[None, None, None, None, None, None, None, '51', '51', '19'],
 [ None, None, None,'55', '55', '55', '55', None, None, None],
['23', '23', '55',None, None, None,None, None, None,None]]
a = np.array(a) # Converting to numpy array
a = a.flatten() # Flatten a list with numpy's builtin function
a = [i for i in a if i != None] # Removing all occurences of None
a = list(a) # Converting back to python list

इसके द्वारा, आप किसी भी आयाम की सूची को समतल कर सकते हैं

0
programmer pro 29 अप्रैल 2020, 14:17
यह एक "समतल" प्रोबेलम नहीं है - समाधान प्रत्येक सूची स्थिति पर नहीं- None मान लेता है और इसे रखता है, गैर को अनदेखा किया जाता है।
 – 
Patrick Artner
29 अप्रैल 2020, 14:22

जबकि अन्य ने एक लाइनर पोस्ट किया है, यहां एक पुनरावर्ती कार्य है जो आपकी सूची में और परतें होने पर काम करेगा।

def unstack_list(temp_list):
    # Construct list of elements to return
    answer = []
    for i in temp_list:
        # if element of list is list, recurse and concatenate lists
        if type(i) == list:
            answer = unstack_list(i) + answer
        # add to list if not None
        elif i is not None:
            answer.append(i)
    return answer
0
12Ghast 29 अप्रैल 2020, 14:28
सलाह के लिये धन्यवाद। लेकिन परिणाम ['51', '51', '19', '23', '23', '55', '55', '55', '55', '55'] क्रम में नहीं है। सूचीबद्ध। और 'टाइपऑफ़' को 'टाइप' में बदला जाना चाहिए
 – 
Angolababa
29 अप्रैल 2020, 14:25
क्षमा करें - इसे आपके लिए ठीक कर दिया; मूल रूप से चूंकि आप रिवर्स ऑर्डर चाहते हैं, आप या तो जिस तरह से निर्मित सूची को संयोजित किया गया है, उसे फ्लिप कर सकते हैं, या इसके बजाय प्रारंभिक सूची को उलट सकते हैं।
 – 
12Ghast
29 अप्रैल 2020, 14:29
लेकिन यह सिर्फ एक उदाहरण है, अन्य मामले अलग-अलग क्रम में हो सकते हैं, जिन्हें मैं केवल फ्लिप नहीं कर सकता
 – 
Angolababa
29 अप्रैल 2020, 14:37
क्या हम मान सकते हैं कि प्रत्येक सूची या तो सूचियों की सूची है या मूल्यों की सूची है? और सूची और मान दोनों वाली कोई सूची नहीं होगी? मैं समझता हूं कि अब प्रश्न से आपका क्या मतलब है, लेकिन आपका प्रारंभिक प्रश्न बहुत खराब था। क्या हम यह भी मान सकते हैं कि प्रत्येक स्थिति में मूल्यों का कोई अतिव्यापन नहीं है? यानी कि [[कोई नहीं, 1], [कोई नहीं, 2]] नहीं होगा?
 – 
12Ghast
29 अप्रैल 2020, 14:42

यह समाधान प्रत्येक पंक्ति का अंतिम गैर-कोई नहीं मान रखता है, और सभी कोई नहीं मान दिखाते हुए किसी भी स्थिति को छोड़ देता है।

def crunchnones(data):
"""
Assumes data is an iterable containing lists of values, and
    returns a single list of all non-None value in all lists in data,
    maintaining their positions inside each list.
If no list contain a non-None value in a given position, that position
    will be silently skipped.
If more than one list contains a non-None value in a given position,
    only the one in the last list will be returned.

Example:
>>> data =  [[None, None, None, None, None, None, None, '51', '51', '19'],
             [None, None, None, '55', '55', '55', '55', None, None, None],
             ['23', '23', '55', None, None, None, None, None, None, None]]
>>> data2 =  [[None, None, None, None, None, None, None, '51', None, '19'],
              [None, None, None, '55', '55', '55', '55', None, None, None],
              [None, '23', '55', None, None, None, None, None, None, None]]
>>> data3 =  [['21', None, None, None, None, None, None, '51', '51', '19'],
              ['22', None, None, '55', '55', '55', '55', None, None, None],
              ['23', '23', '55', None, None, None, None, None, None, None]]

>>>crunchnones(data)
['23', '23', '55', '55', '55', '55', '55', '51', '51', '19']
>>>crunchnones(data2)
['23', '55', '55', '55', '55', '55', '51', '19']
>>>crunchnones(data3)
['23', '23', '55', '55', '55', '55', '55', '51', '51', '19']
>>>
"""
#
temp = {}
for riga in data:
    temp.update({i: x for i, x in enumerate(riga) if x is not None})
return [temp[i] for i in sorted(temp)]
0
FAL 14 मई 2020, 13:55