मेरा पूर्णांक इनपुट माना जाता है 12345, मैं विभाजित करना चाहता हूं और इसे एक सरणी में डाल सकता हूं 1, 2, 3, 4, 5। मैं इसे कैसे कर पाऊंगा?
जवाबों:
[int(i) for i in str(number)]
या, यदि आप सूची समझ का उपयोग नहीं करना चाहते हैं या आप 10 से भिन्न आधार का उपयोग करना चाहते हैं
from __future__ import division # for compatibility of // between Python 2 and 3
def digits(number, base=10):
assert number >= 0
if number == 0:
return [0]
l = []
while number > 0:
l.append(number % base)
number = number // base
return l
divmod
मैं इसके बजाय एक पूर्णांक को एक स्ट्रिंग में नहीं बदलूंगा, इसलिए यहां वह फ़ंक्शन है जो मैं इसके लिए उपयोग करता हूं:
def digitize(n, base=10):
if n == 0:
yield 0
while n:
n, d = divmod(n, base)
yield d
उदाहरण:
tuple(digitize(123456789)) == (9, 8, 7, 6, 5, 4, 3, 2, 1)
tuple(digitize(0b1101110, 2)) == (0, 1, 1, 1, 0, 1, 1)
tuple(digitize(0x123456789ABCDEF, 16)) == (15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1)
जैसा कि आप देख सकते हैं, यह दाएं से बाएं तक अंक प्राप्त करेगा। यदि आप अंकों को बाएँ से दाएँ चाहते हैं, तो आपको इसका एक क्रम बनाने की आवश्यकता होगी, फिर इसे उल्टा कर दें:
reversed(tuple(digitize(x)))
आप इस फ़ंक्शन का उपयोग आधार रूपांतरण के लिए भी कर सकते हैं क्योंकि आप पूर्णांक को विभाजित करते हैं। निम्न उदाहरण एक हेक्साडेसिमल संख्या को बाइनरी निबल्स में ट्यूपल्स के रूप में विभाजित करता है:
import itertools as it
tuple(it.zip_longest(*[digitize(0x123456789ABCDEF, 2)]*4, fillvalue=0)) == ((1, 1, 1, 1), (0, 1, 1, 1), (1, 0, 1, 1), (0, 0, 1, 1), (1, 1, 0, 1), (0, 1, 0, 1), (1, 0, 0, 1), (0, 0, 0, 1), (1, 1, 1, 0), (0, 1, 1, 0), (1, 0, 1, 0), (0, 0, 1, 0), (1, 1, 0, 0), (0, 1, 0, 0), (1, 0, 0, 0))
ध्यान दें कि यह विधि दशमलव को नहीं संभालती है, लेकिन इसे अनुकूलित किया जा सकता है।
@ और कहते हैं, लेकिन बिल्ट-इन फ़ंक्शन का उपयोग करके किसी भिन्न आधार में कनवर्ट करने के लिए
>>> [ int(i,16) for i in '0123456789ABCDEF' ]
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15]
>>> [int(i,2) for i in "100 010 110 111".split()]
[4, 2, 6, 7]
मुझे नहीं पता कि अंतिम उद्देश्य क्या है लेकिन सामान की तरह करने के लिए अजगर के दशमलव मॉड्यूल के अंदर भी एक नज़र डालें
>>> Decimal('3.1415926535') + Decimal('2.7182818285')
Decimal('5.85987')
Decimalइस सवाल के लिए बेकार है
जबकि list(map(int, str(x)))pythonic दृष्टिकोण है, तो आप किसी भी प्रकार के रूपांतरण के बिना प्राप्त अंकों के तर्क तैयार कर सकते हैं:
from math import log10
def digitize(x):
n = int(log10(x))
for i in range(n, -1, -1):
factor = 10**i
k = x // factor
yield k
x -= k * factor
res = list(digitize(5243))
[5, 2, 4, 3]
एक जनरेटर का एक लाभ आप के लिए समेकित रूप से फ़ीड कर सकते हैं set, tuple, nextकिसी भी अतिरिक्त तर्क के बिना, आदि,।
अंकों के लिए एक एकल संख्या को विभाजित करना (जैसा कि सभी ने उत्तर दिया है):
>>> [int(i) for i in str(12345)]
[1, 2, 3, 4, 5]
लेकिन, अंकों की सूची से अंक प्राप्त करने के लिए:
>>> [int(d) for d in ''.join(str(x) for x in [12, 34, 5])]
[1, 2, 3, 4, 5]
तो यह जानना पसंद है, अगर हम ऊपर, और अधिक कुशलता से कर सकते हैं।
शायद join+ split:
>>> a=12345
>>> list(map(int,' '.join(str(a)).split()))
[1, 2, 3, 4, 5]
>>> [int(i) for i in ' '.join(str(a)).split()]
[1, 2, 3, 4, 5]
>>>
str.join+ str.splitआपका मित्र है, हम भी सूची का उपयोग करते हैं mapया list comprehensionप्राप्त करते हैं, (विभाजित करते हैं जो हम :-) में शामिल होते हैं)।
एक और समाधान जिसमें स्ट्रिंग्स को / से परिवर्तित करना शामिल नहीं है:
from math import log10
def decompose(n):
if n == 0:
return [0]
b = int(log10(n)) + 1
return [(n // (10 ** i)) % 10 for i in reversed(range(b))]
पिछले उत्तरों के अनुसार, तार चलने योग्य हैं, इसलिए यदि आपको अपने अंकों की सूची की आवश्यकता है, तो आप इसे एक के बाद एक करके जोड़ सकते हैं:
digits = []
digits += str(12345)
list(map(int,str(12345)))