मैं प्रत्येक आइटम के लिए नेस्टेड और अननेस्टेड स्ट्रिंग्स और पूर्णांकों की सूची से 10 से अधिक न्यूनतम संख्या निकालने का प्रयास कर रहा हूं। मैंने कुछ अलग चीजों की कोशिश की है लेकिन वे या तो कुछ भी नहीं लौटाते हैं या कुछ अलग त्रुटि संदेश (अपेक्षित स्ट्रिंग या बफर, '>' int और सूची के बीच संभव नहीं हैं उनमें से दो थे)। उन्हें क्रम में रहने की आवश्यकता है क्योंकि बाद में उन्हें पांडा डेटा फ्रेम में दर्ज किया जाएगा।

starting_list = [['4dfg', '12kfmgfg','dfgdf133'],[8, '16dgdfg'], 11, '', 'fdsf']

desired_result = [12, 16, 11, NaN, NaN]

मैंने कोशिश की विभिन्न कार्यों में से 2 नीचे दिए गए हैं। क्योंकि परिणाम डेटा फ्रेम में जा रहे हैं, एक पांडा-आधारित उत्तर भी ठीक होगा।

def min_int(data):
    for item in range(len(data)):
        for i in range(len(data[item])):
            if type(data[item][i]) == int:
                if data[item][i] >10:
                    data.remove(data[item][i])
            else:
                data[item][i] =int(re.sub(r'\D', "", data[item]))
                if data[item][i] >10:
                    data.remove(data[item][i])
        data[item] = min(data)

def remove_text(data):
    for i in range(len(data)):
        try:
            for ii in range(len(data[i])):
                try:
                    data[i][ii] =int(re.sub(r'\D', "", data[item]))
                except:
                    continue
        except:
            continue 

धन्यवाद!

3
blablahorse 13 अक्टूबर 2020, 13:01

3 जवाब

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

उपयोग:

s = pd.Series(data)
a = (pd.to_numeric(s.explode() #explode lists
                     .astype(str) #convert all values to strings
                     .str.replace(r'\D', ''), errors='coerce') #replace and convert to numbers if possible
                     .loc[lambda x: x > 10] #filter values
                     .min(level=0) #get minimal per index
                     .reindex(s.index) #add removed values of index
                     .tolist()) #convert to list

#convert non NaNs to integers
a = [int(x) if x == x else x for x in a]
print (a)
[12, 16, 11, nan, nan]

आपका कार्य सरल होना चाहिए:

def try_to_int(x):
    try:
        return int(re.sub(r'\D', "", x))
    except:
        return np.nan

def min_int(x):
    if isinstance(x, int):
        return x
    elif isinstance(x, list):
        gen = (try_to_int(y) for y in x)
        return min(y for y in gen if y == y and y > 10)
    else:
        return try_to_int(x)
        

print ([min_int(x) for x in starting_list])
[12, 16, 11, nan, nan]
    
0
jezrael 13 अक्टूबर 2020, 13:30

यद्यपि आपके पास पहले से ही पांडा-विज़ @jezrael द्वारा स्वीकृत उत्तर है, यदि आप चाहें तो यहां निम्न स्तर का दृष्टिकोण है।

अनिवार्य रूप से, यह संख्यात्मक मानों को निकालने के लिए रेगेक्स का उपयोग करता है, और आपकी आवश्यकता को पूरा करने के लिए फ़िल्टर करता है, फिर उन्हें आउटपुट सूची में जोड़ता है।

import re

exp = re.compile(r'(\d+)')

new = []
for i in list_:
    if isinstance(i, list):
        new2 = []
        for j in i:
            f = exp.findall(str(j))
            new2.append(int(f[0]) if f else float('nan'))
        new.append(min(i for i in new2 if i > 10))
    else:
        f = exp.findall(str(i))
        new.append(int(f[0]) if f else float('nan'))

आउटपुट:

>>> [12, 16, 11, nan, nan]

सेट अप:

list_ = [['4dfg', '12kfmgfg', 'dfgdf133'],
         [8, '16dgdfg'],
         11,
         '',
         'fdsf']
0
S3DEV 18 नवम्बर 2020, 14:59

आप एक जनरेटर बना सकते हैं:

from collections.abc import Iterable
import re


def select_numbers(items, limit=10):
    for item in items:
        if isinstance(item, Iterable) and not isinstance(item, str):
            yield from select_numbers(item, limit)
        else:
            item = re.sub(r"\D", "", str(item))
            if item == "":
                yield float("NaN")
            elif int(item) > limit:
                yield int(item)
                 

इसका परीक्षण करना:

>>> starting_list = [['4dfg', '12kfmgfg','dfgdf133'],[8, '16dgdfg'], 11, '', 'fdsf']
>>>
>>> desired_result = select_numbers(starting_list)       # generator, not a list
>>> list(desired_result)
[12, 133, 16, 11, nan, nan]
>>> desired_result = select_numbers(starting_list)      # re-creating exhausted generator
>>>
>>> for elem in desired_result:                         # direct use of generator in loop
>>>     print(elem)
12
133
16
11
nan
nan
-1
MarianD 13 अक्टूबर 2020, 16:07