2015-07-03 5 views
3

У меня есть целое число, которое выглядит как этотцелое манипуляции с питоном

a = 1010101010010100 

, что я хотел бы превратиться в нечто вроде этого

list = [[1,0,1,0],[1,0,1,0],[1,0,0,1],[0,1,0,0]] 

То, что я пытался сделать что-то вроде

b = str(a) 
list1 = []; 
for x in b: 
    if b.index(x)==0: 
     tmp_list = []; 
    if b.index(x)!=0%3: 
     tmp_list.append(x): 
    if b.index(x)==0%3 & b.index(x)!=0: 
     list1.append(tmp_list) 
     tmp_list=[]; 

Я не получаю результат, как ожидалось.

+0

ли вы на самом деле означает 'а = 1010101010010100'? Не 'a = 0b1010101010010100'? – marcus

+0

Являются ли критерии, чтобы просто разделить его на 4 группы символов? Есть гораздо более простые способы сделать это. – SuperBiasedMan

+0

Похоже на ситуацию, когда вы хотите использовать 'enumerate', а не' .index (x) ', если' x' встречается несколько раз. – shuttle87

ответ

0

Вот мое решение:

a = 1010101010010100 
k = [] 
m = [int(i) for i in str(a)] 

for j in range(0, len(m), 4): 
    k.append(m[j:j+4]) 

выход:

[[1, 0, 1, 0], [1, 0, 1, 0], [1, 0, 0, 1], [0, 1, 0, 0]] 
0

У вас есть много вопросов, в вашем коде -

  1. Я думаю, что вы хотите сделать - b.index(x)%3 == 0 и не b.index(x)!=0%3 (что не имеет большого смысла и всегда ложно, если b.index (x) равно 0.

  2. У вас есть двоеточие в строке - tmp_list.append(x):, это синтаксическая ошибка (вероятно, вы должны удалить ее).

  3. & является поразрядным и оператором в python, я считаю, что вы должны использовать оператор and вместо &.

  4. list.index(<element>) дает первый индекс, в котором элемент существует, так как ваша строка состоит только из 1 и 0, это никогда не будет идти мимо индекса 2. Вместо этого вы должны думать об использовании enumerate функции, что обеспечит вам индекс, а также как значение элемента.

Предложение -

  1. Вы не должны иметь условие if b.index(x)==0:, вы можете просто определить temp_list вне для цикла.

  2. Использовать if/elif (вместо всех if).

Пример кода -

b = str(a) 
list1 = [] 
tmp_list = [] 
for i,x in enumerate(b): 
    if i%4!=0 or i==0: 
     tmp_list.append(x) 
    else: 
     list1.append(tmp_list) 
     tmp_list=[] 
     tmp_list.append(x) 

выход -

[['1', '0', '1', '0'], ['1', '0', '1', '0'], ['1', '0', '0', '1']] 
+0

Благодарим вас за предложение. Когда я написал это, он был довольно псевдокодом. Так как я писал это из памяти. –

+0

Добро пожаловать, не забудьте принять ответы в зависимости от того, что вам помогло, это поможет сообществу и любому, кто увидит этот вопрос позже. –

-1

Один из них должен делать (будет предоставлять различные результаты в случае, если ваша длина номер% 4!= 0):

num = 1010101010010100 
[str(num)[i:i+4] for i in range(0, len(str(num)), 4)] 
[str(num)[i*4:i*4+4] for i in range(0, len(str(num))//4)] 
0
b = str(a) 
n = 4 
[list([b[i:i+n]) for i in range(0,len(b),n)] 
+0

красивый. Благодарю вас, сэр. –

+0

Элегантное решение. – gustafbstrom

1

Если вы хотите разделить вашу последовательность в группах по 4 человека, вы можете просто сделать:

>>> b='1010101010010100' 

>>> [b[i:i+4] for i in range(0, len(b), 4)] 
['1010', '1010', '1001', '0100'] 

или обернуть деталь в list(..) если вам нужен именно список списки:

>>> [list(b[i:i+4]) for i in range(0, len(b), 4)] 
[['1', '0', '1', '0'], ['1', '0', '1', '0'], ['1', '0', '0', '1'], ['0', '1', '0', '0']] 

кроме того, если элементы в подсписках должны быть int:

>>> [list(int(c) for c in b[i:i+4]) for i in range(0, len(b), 4)] 
[[1, 0, 1, 0], [1, 0, 1, 0], [1, 0, 0, 1], [0, 1, 0, 0]] 
+0

@mescalinum благодарит вас за элегантное решение! –

-2

Список постижение ваш друг (как и многие другие времена):

a = 1010101010010100 
[list(str(a))[i:i+4] for i in range(0,len(str(a)),4)] 
+1

Эй думает. Я сделал свою долю манипуляций с списками, но никогда не видел, чтобы он использовался с диапазоном с тремя аргументами. Спасибо! –

-3

я +1 к себе за время цикла и -1 себя за уродливого молнии:

a = 1010101010010100 
result = [] 

while a: 
    a, x = divmod(a, 10) 
    result.append(x) 

result.reverse() 
result = zip(result[0::2], result[1::2], result[2::2], result[3::2]) 

print(list(result)) 
+0

, чтобы избежать цикла 'while' use' functools.reduce' – fferri

+0

Спасибо, это здорово. Но цикл while более очевидный, чем сокращение здесь. – marcus

+0

Хорошо, это не здорово, потому что он не работает. ;) – marcus

0

Вид эффективного решения может быть таким: от itertools receipes

Он возвращает итератор, поэтому он должен быть довольно f аст.

from itertools import izip_longest 

def grouper(iterable, n, fillvalue=None): 
    args = [iter(iterable)] * n 
    return izip_longest(fillvalue=fillvalue, *args) 

numbers = str(1010101010010100) 
nth = 3 
result = grouper(numbers, nth) 
0
import math 

a = 1010101010010100 
res = [] 

long = math.ceil(math.log10(a)) 
digits = [0] * (4 - long % 4) if long % 4 else [] 
digits.extend([int(i) for i in str(a)]) 

for i in xrange(0, len(digits), 4): 
    res.append(digits[i:i+4]) 

print(res) 
Смежные вопросы