मेरे पास सूचियों की एक श्रृंखला है (एक शब्दकोश के भीतर) और मैं किसी भी तत्व को हटाना चाहता हूं जिसमें केवल None तत्व हैं। हालाँकि, सूचियों में विभिन्न स्वरूपण हैं उदा।

x=[None,[None],[None]]
x=[None,None,None]
x=[None,[None,None],[None,None]]

जहां किसी भी None को एक मान से बदला जा सकता है।

कोई भी उदाहरण निम्नलिखित शब्दकोश होगा:

dict={"x1": [None,None,None],"x2": [None,[None],[None]], "x3": [None,[1],[0.5]],
      "x4":[None,[None,None],[None,None]],"x5":[None,[180,-360],[90,-180]]}

इस मामले में मैं (key,value) जोड़े "x3" और "x5" रखना चाहूंगा क्योंकि उनमें वे मान हैं जो सभी None नहीं हैं, लेकिन "x1" को हटाना चाहते हैं, "x2", और "x4" इस प्रकार लौट रहे हैं:

dict={"x3": [None,[1],[0.5]], "x5":[None,[180,-360],[90,-180]]}

शब्दकोश में विभिन्न सूचियों (x) पर एक साधारण सूची समझ जैसे

any(e is not None for e in x)

[None] प्रविष्टियों को not None के रूप में पढ़ता है और True लौटाता है।

मैं कैसे निर्धारित कर सकता हूं कि किन सूचियों में वास्तव में [None] तत्वों के बजाय एक मान है। मैंने वर्गाकार कोष्ठकों को हटाने के विकल्पों पर ध्यान दिया है, उदा। itertools का उपयोग करना, जैसा कि यहां सुझाया गया है [पायथन में सूची से कोष्ठक हटाएं ], लेकिन ये सभी सूची में सभी तत्वों को उसी तरह स्वरूपित करने पर निर्भर करते हैं, जबकि मेरे पास मिश्रित स्वरूपण है। मैं स्वरूपण को बदलने में असमर्थ हूं क्योंकि इस प्रारूप में सॉफ़्टवेयर में कहीं और इसकी आवश्यकता है।

0
218 28 मार्च 2018, 19:05

3 जवाब

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

आप यह जांचने के लिए एक कस्टम रिकर्सिव फ़ंक्शन लिख सकते हैं कि नेस्टेड सूची के सभी तत्व None हैं या नहीं।

def is_none(a):
    return all(x is None if not isinstance(x, list) else is_none(x) for x in a)

my_dict = {"x1": [None, None, None],
           "x2": [None, [None], [None]],
           "x3": [None, [1], [0.5]],
           "x4": [None, [None, None], [None, None]],
           "x5": [None, [180, -360], [90, -180]]}

new_dict = {k: v for k, v in my_dict.items() if not is_none(v)}
print(new_dict)
# {'x3': [None, [1], [0.5]], 'x5': [None, [180, -360], [90, -180]]}
3
Keyur Potdar 29 मार्च 2018, 10:19

यह समाधान प्रकृति में केयूर पोटदार के समान है, लेकिन यह सभी प्रकार के कंटेनरों के लिए काम करता है, न केवल list:

my_dict = {
    "x1": [None, None, None],
    "x2": [None, [None], [None]],
    "x3": [None, [1], [0.5]],
    "x4": [None, [None, None], [None, None]],
    "x5": [None, [180, -360], [90, -180]],
}

def all_None(val):
    # Check for None
    if val is None:
        return True
    # val is not None
    try:
        # val may be a container
        return all(all_None(el) for el in val)
    except:
        # val is neither None nor a container
        return False

my_dict_filtered = {key: val for key, val in my_dict.items() if not all_None(val)}
print(my_dict_filtered)
1
jmd_dk 29 मार्च 2018, 10:33

बेंजामिन की टिप्पणी के अनुसार, यदि list_input में सभी नेस्टेड सूची में समान मान val_to_check और False है, तो यह फ़ंक्शन ट्रू वापस आ जाना चाहिए:

def check_val(list_input, val_to_check):
    for elem in list_input:
        if isinstance(elem, list):
            if check_val(elem, val_to_check) == False:
                return False
        else:
            if elem != val_to_check:
                return False
    return True
3
Ben.T 28 मार्च 2018, 18:11