পাইথনগুলিতে স্ট্রিংগুলিকে পূর্ণসংখ্যায় রূপান্তর কীভাবে?


438

আমার এই জাতীয় মাইএসকিউএল কোয়েরি থেকে টিপলস রয়েছে:

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
সম্ভবত একটি ভিন্ন ডাটাবেস অ্যাডাপ্টার মডিউল বিবেচনা? আমি জানি পোস্টগ্রাইএসকিউএল অ্যাডাপ্টার মডিউলগুলি আপনার টি 2 সেটের মতো ফলাফলগুলি দেবে।
kquinn


দয়া করে লক্ষ্য করুন: মানচিত্র ব্যবহার করার সময়, আপনি অজগর 3 এবং 3.5 তে মানচিত্রের সামগ্রীর একটি তালিকা পাবেন। এটি উপরোক্ত হিসাবে পাইথন 3.5 এর জন্য এটি করে। নতুন_লিস্ট = তালিকা (তালিকা (অন্তর্নির্মিত (ক) খ এর জন্য বি) টি-তে খ এর জন্য a.isdigit ())
অতিথি

উত্তর:


630

int()একটি স্ট্রিংটিকে একটি পূর্ণসংখ্যার মানতে রূপান্তর করতে পাইথন স্ট্যান্ডার্ড অন্তর্নির্মিত ফাংশন। আপনি এটিকে আর্গুমেন্ট হিসাবে একটি সংখ্যক স্ট্রিং দিয়ে কল করেছেন এবং এটি সংখ্যায় পূর্ণসংখ্যায় রূপান্তরিত করে:

print (int("1") + 1)

উপরের প্রিন্ট 2

আপনি যদি নিজের তালিকার কাঠামো টি 1 টি জানেন (এটিতে কেবল তালিকাগুলি রয়েছে, কেবলমাত্র একটি স্তর), আপনি পাইথন 2 এ এটি করতে পারেন:

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
@ ফ্লাইংশিপ আমার কাছে দ্বিগুণ মানচিত্র নির্বোধ মনে হচ্ছে, এটি ঠিক আছে।
জামিলাক

পাইথন 2 উদাহরণ অপসারণ সম্পর্কে (পাইথন 2 এর জন্য জীবনের শেষের কারণে)?
অ্যালিসো

28

আপনি একটি তালিকা বোঝার সাথে এটি করতে পারেন:

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

ভেতরের তালিকা ধী ( [int(column) for column in row]) একটি তৈরী করে listএর intএকটি ক্রম থেকে গুলি intমধ্যে -able বস্তু, দশমিক স্ট্রিং মত, row। বাইরের তালিকা অনুধাবন ( [... 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)

এটি আইডিএল ট্রুতে মুদ্রণ করা উচিত কারণ এক্স একটি সংখ্যা।

y_test = is_number(y)

print(y_test)

এটি IDLE মিথ্যাতে মুদ্রণ করা উচিত কারণ y সংখ্যাটিতে নয় a


2
আপনার is_number ফাংশনটি ভুল। '1' 1 এর সমান নয় This এটি পার্ল নয়। :
পি

3
চাকা পুনরায় উদ্ভাবন করবেন না, ব্যবহার করুন x.isnumeric()
bfontaine

4

তালিকা বোঝার ব্যবহার:

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

1
অজগর 3 এ এটি মানচিত্রের অবজেক্টগুলির একটি তালিকা ফেরত পাঠায় :(
সিপিল করুন

3

পাইথনগুলিতে এই কাজের মতো 3.5.1 বিষয়গুলি:

c = input('Enter number:')
print (int(float(c)))
print (round(float(c)))

এবং

Enter number:  4.7
4
5

জর্জ।


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
এলি কোরভিগো

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]ট্রিক করবে। (এখানে একটি তালিকা বোধগম্য এবং মানচিত্রের কল রয়েছে (চ, এলএসটি), যা সেখানে [চ (ক) এর জন্য একটি এর জন্য] সমান)

ইভাল আপনি যা করতে চান তা নয় , যদি __import__("os").unlink("importantsystemfile")কোনও কারণে আপনার ডাটাবেসে কোনও রকম কিছু থাকে। সর্বদা আপনার ইনপুটটি বৈধ করুন (অন্য কোনও কিছু না থাকলে, ব্যতিক্রমী ইনট () আপনার খারাপ ইনপুট থাকলে উত্থাপন করবে)।


-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)

এক্স অ্যারেজের এলোমেলো ক্রমানুসরণ তৈরি করবে। আপনি যা চেয়েছিলেন ঠিক তা নয় , তবে এটি অনুরূপ প্রশ্নের সম্ভাব্য সমাধান।

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