पायथन में तार को पूर्णांक में कैसे बदलें?


438

मेरे पास इस तरह से एक MySQL क्वेरी से ट्यूपल्स का एक टपल है:

T1 = (('13', '17', '18', '21', '32'),
      ('07', '11', '13', '14', '28'),
      ('01', '05', '06', '08', '15', '16'))

मैं सभी स्ट्रिंग तत्वों को पूर्णांक में परिवर्तित करना चाहता हूं और उन्हें सूची की सूची में वापस रखना चाहता हूं:

T2 = [[13, 17, 18, 21, 32], [7, 11, 13, 14, 28], [1, 5, 6, 8, 15, 16]]

मैंने इसे हासिल करने की कोशिश की, evalलेकिन अभी तक कोई भी अच्छा परिणाम नहीं मिला।


2
शायद एक अलग डेटाबेस एडेप्टर मॉड्यूल पर विचार करें? मुझे पता है कि PostgreSQL एडाप्टर मॉड्यूल आपके T2 सेट की तरह परिणाम लौटाएगा।
क्विन


कृपया ध्यान दें: मानचित्र का उपयोग करते समय, आपको पायथन 3 और 3.5 में मानचित्र वस्तुओं की एक सूची मिलेगी। जैसा कि ऊपर उल्लेख किया गया है, यह पायथन 3.5 के लिए करता है। new_list = सूची (सूची (b में a के लिए (a) a) के लिए T1 में b.isdigit ())
अतिथि

गैर-नेस्टेड सूची के लिए समान प्रश्न: सूची में सभी स्ट्रिंग्स को int में बदलें
Aran-Fey

जवाबों:


630

int()एक स्ट्रिंग को पूर्णांक मान में बदलने के लिए पायथन मानक अंतर्निहित फ़ंक्शन है। आप इसे एक स्ट्रिंग के साथ तर्क के रूप में एक संख्या के साथ कहते हैं, और यह पूर्णांक में परिवर्तित संख्या लौटाता है:

print (int("1") + 1)

उपरोक्त प्रिंट 2

यदि आप अपनी सूची की संरचना जानते हैं, तो T1 (कि इसमें केवल सूचियाँ हैं, केवल एक स्तर है), आप इसे पायनियर सूची में कर सकते हैं:

T2 = [map(int, x) for x in T1]

पायथन 3 में:

T2 = [list(map(int, x)) for x in T1]

4
क्यों नहीं T2 = map(lambda lol: map(int, lol), T1)? या तो नक्शा या सूची की समझ, दोनों मूर्खतापूर्ण हैं;)
उड़ने वाली भेड़

4
@flyingsheep डबल मैप मुझे मूर्खतापूर्ण लगता है, यह ठीक लगता है।
जामिलाक

पायथन 2 उदाहरण को हटाने के बारे में कैसे (पायथन 2 के लिए जीवन के अंत के कारण)?
एलिसो

28

आप इसे सूची समझ के साथ कर सकते हैं:

T2 = [[int(column) for column in row] for row in T1]

इनर लिस्ट कॉम्प्रिहेंशन ( [int(column) for column in row]) दशमलव अनुक्रमों की तरह, अनुक्रमित-योग्य ऑब्जेक्ट्स से एक listका निर्माण करता है । बाहरी सूची बोधगम्यता ( ) प्रत्येक आइटम पर लागू आंतरिक सूची समझ के परिणामों की एक सूची बनाता है ।intintrow[... for row in T1])T1

कोड स्निपेट विफल हो जाएगा यदि किसी भी पंक्तियों में ऐसी वस्तुएं हैं जिन्हें परिवर्तित नहीं किया जा सकता है int। यदि आप गैर-दशमलव तार वाली पंक्तियों को संसाधित करना चाहते हैं, तो आपको एक स्मार्ट फ़ंक्शन की आवश्यकता होगी।

यदि आप पंक्तियों की संरचना जानते हैं, तो आप कॉल के फ़ंक्शन के लिए आंतरिक सूची समझ को कॉल के साथ बदल सकते हैं। उदाहरण के लिए।

T2 = [parse_a_row_of_T1(row) for row in T1]

16

मैं केवल समझ वाली सूचियों का उपयोग करना पसंद करूंगा:

[[int(y) for y in x] for x in T1]

12

डालने के बजाय int( ), डाल float( )दें जो आपको पूर्णांक के साथ दशमलव का उपयोग करने देगा।


2
क्या आप उत्तर के बारे में अधिक जानकारी बता सकते हैं?
रिको

10

मैं अब तक के हर जवाब से सहमत हूं लेकिन समस्या यह है कि यदि आपके पास सभी पूर्णांक नहीं हैं तो वे दुर्घटनाग्रस्त हो जाएंगे।

यदि आप गैर-पूर्णांक को बाहर करना चाहते हैं तो

T1 = (('13', '17', '18', '21', '32'),
      ('07', '11', '13', '14', '28'),
      ('01', '05', '06', '08', '15', '16'))
new_list = list(list(int(a) for a in b) for b in T1 if a.isdigit())

इससे केवल वास्तविक अंक मिलते हैं। कारण मैं प्रत्यक्ष सूची समझ का उपयोग नहीं करते क्योंकि सूची समझ उनके आंतरिक चर लीक करता है।


2
isdigitमुश्किल है, इस पर प्रयास करें -1। / int(<str>)द्वारा जाँच करने का तरीका है । tryexcept
टोटोरो

9
T3=[]

for i in range(0,len(T1)):
    T3.append([])
    for j in range(0,len(T1[i])):
        b=int(T1[i][j])
        T3[i].append(b)

print T3

7
ढेर अतिप्रवाह में आपका स्वागत है! केवल कोड का एक खंड पोस्ट करने के बजाय, कृपया बताएं कि यह कोड समस्या का हल क्यों निकालता है। स्पष्टीकरण के बिना, यह एक उत्तर नहीं है।
आर्टेमिक्स

7

इसे इस्तेमाल करे।

x = "1"

x एक स्ट्रिंग है क्योंकि इसके चारों ओर उद्धरण हैं, लेकिन इसमें एक संख्या है।

x = int(x)

चूंकि x में संख्या 1 है, इसलिए मैं इसे पूर्णांक में बदल सकता हूं।

यह देखने के लिए कि क्या एक स्ट्रिंग एक संख्या है, आप ऐसा कर सकते हैं।

def is_number(var):
    try:
        if var == int(var):
            return True
    except Exception:
        return False

x = "1"

y = "test"

x_test = is_number(x)

print(x_test)

इसे IDLE True पर प्रिंट करना चाहिए क्योंकि x एक नंबर है।

y_test = is_number(y)

print(y_test)

इसे IDLE फाल्स पर प्रिंट करना चाहिए क्योंकि y एक संख्या में नहीं है।


2
आपका is_number फ़ंक्शन गलत है। '1' 1 के बराबर नहीं है। यह पर्ल नहीं है। :-P
Veky

3
पहिया को सुदृढ़ न करें, उपयोग करें x.isnumeric()
bfontaine

4

सूची समझ का उपयोग करना:

t2 = [map(int, list(l)) for l in t1]

1
अजगर 3 में यह मानचित्र वस्तुओं की सूची देता है :(
CpILL


3

इस समारोह को देखें

def parse_int(s):
    try:
        res = int(eval(str(s)))
        if type(res) == int:
            return res
    except:
        return

फिर

val = parse_int('10')  # Return 10
val = parse_int('0')  # Return 0
val = parse_int('10.5')  # Return 10
val = parse_int('0.0')  # Return 0
val = parse_int('Ten')  # Return None

आप भी देख सकते हैं

if val == None:  # True if input value can not be converted
    pass  # Note: Don't use 'if not val:'

evalबुराई है: आप के साथ बदलना चाहिए ast.literal_eval
एली कोरविगो 16

3

फिर भी पायथन 2 के लिए एक और कार्यात्मक समाधान:

from functools import partial

map(partial(map, int), T1)

अजगर 3 हालांकि थोड़ा गड़बड़ हो जाएगा:

list(map(list, map(partial(map, int), T1)))

हम इसे एक आवरण के साथ ठीक कर सकते हैं

def oldmap(f, iterable):
    return list(map(f, iterable))

oldmap(partial(oldmap, int), T1)

1

यदि यह केवल टुपल्स का एक टुकड़ा है, कुछ पसंद है rows=[map(int, row) for row in rows] की चाल चलेगा। (सूची की समझ और नक्शे (f, lst) के लिए एक कॉल है, जो कि [f (a) for lst में] के बराबर है।

Eval है नहीं कि आप क्या करना चाहते हैं, मामले में कुछ ऐसा है __import__("os").unlink("importantsystemfile")किसी कारण से आपका डेटाबेस में। हमेशा अपने इनपुट को मान्य करें (यदि और कुछ नहीं है, तो अपवाद int () खराब इनपुट होने पर उठाएगा)।


-1

आप ऐसा कुछ कर सकते हैं:

T1 = (('13', '17', '18', '21', '32'),  
     ('07', '11', '13', '14', '28'),  
     ('01', '05', '06', '08', '15', '16'))  
new_list = list(list(int(a) for a in b if a.isdigit()) for b in T1)  
print(new_list)  

-1

मैं एक उपलब्ध विकल्प साझा करना चाहता हूं जो यहां अभी तक उल्लिखित नहीं लगता है:

rumpy.random.permutation(x)

सरणी x का यादृच्छिक क्रमांकन उत्पन्न करेगा। आपने जो मांगा था, वैसा ही नहीं , बल्कि यह इसी तरह के सवालों का एक संभावित समाधान है।

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