Python - Split user input integer into list, where

2019-07-10 00:14发布

问题:

So I'm trying to split an arbitrarily long user input integer into a list where each entry is 2 digits, and if the number has an odd amount of integers put the only single digit as the first digit. (Where I will then proceed to put a zero in front of it)

I know that putting user integer input into a list looks like:

userintegerlist = [int(i) for i in str(user_input)]
print userintegerlist

And my input (say it's 45346) will look like [4,5,3,4,6]. But I want it to look like: [4,53,46]. Or if input is 68482238, it will be: [68,48,22,38].

Is this possible? All the code is in Python by the way.

回答1:

You can do it with string methods fairly easily, as other answers have already shown. I direct you to the related grouper recipe in itertools.

I want to mention that it may be more efficient to do it with maths:

>>> n = 45346
>>> output = []
>>> while n:
...     output.append(n % 100)
...     n //= 100
...     
>>> output = output[::-1]
>>> print output
[4, 53, 46]


回答2:

s = raw_input()
if(len(s)%2 ==1):
    s = '0'+s
list = []
for i in range(len(s)/2):
    list.append(int(s[2*i:2*i+2]))
print list

After taking the input string, check if its of odd length, and if yes, prefix a 0 to it. Then , iterate over the string , taking two characters at a time , cast that substring to int , and append it in a list. It's that simple.



回答3:

Given an input such as '12345' what you can do is turn that into a list and then iterate over it in reverse trying to pop two elements at a time and then inserting those at the beginning of the list as integers (after joining them together).

If you fail to pop a second element, then you just prefix the popped element with a 0 and also insert that at the beginning of the output list.

Here's a very dirty solution that attempts this:

def foo(user_input):
    transformed_input = list(user_input)
    out = []
    while transformed_input:
        a = transformed_input.pop()
        try:
            b = transformed_input.pop()
            a = b + a
        except IndexError:
            a = '0' + a 
        out.insert(0, a)
    return out

For an input such as '345' you get ['03', '45']

And then for '3456' you get ['34', '56']

Is this what you wanted?



回答4:

The strategy in my code is to create a mirror list and pair up the elements between the two lists

 user_input = '123192873918271'
    split_input = list(user_input)

#EXAMINE WHETHER THE LIST HAS AND ODD OR EVENT NUMBER OF ENTRIES
if len(user_input)%2==1 :

    #create a mirror list that we will pair the original one
    mirror_list = ['0']+ split_input 

    #pair up the elements in both lists
    final_list = [i+j for i,j in zip(mirror_list, split_input)]
elif len(user_input)%2==0:

    #in this case, we pair up the list with itself, with a 1 element shift
    final_list = [i+j for i,j in zip(split_input[:-1], split_input[1:])]

for i in final_list:
 print i

    01
    12
    23
    31
    19
    92
    28
    87
    73
    39
    91
    18
    82
    27
    71


回答5:

>>> split = lambda s: (len(s)&1 and [s[0]] or []) + [s[i-1]+s[i] for i in range(len(s)-1,0,-2)][::-1]
>>> split("45346")
['4', '53', '46']
>>> split("68482238")
['68', '48', '22', '38']


回答6:

You can group the items using the same iterator on the pair, without using any indexing on the string:

user_input = '45346'
user_input = '0'+user_input if len(user_input)%2 else user_input
gi = [iter(user_input)]*2
r = [''.join(z) for z in zip(*gi)]
print(r)

produces

['04', '53', '46']