2015-10-26 3 views
1

У меня есть список строк, которые выглядят так, и мне нужно добавить первую, вторую и третью записи каждого в целочисленный список ab и c соответственноКак добавить элементы в список строк в массив в python

порезы печати дает мне

[['3', '5', '10'], ['2', '8', '15'], ['7', '9', '25'], ['4', '6', '20'], ['9', '12', '50'], ['5', '7', '22'], ['3', '8', '17'], ['6', '9', '24'], ['8', '11', '40'], ['7', '10', '30'], []] 

таким образом, что а = [3,2,7, ..., 7] б = [5, 8, 9, ..., 10] c = [10, 15, ..., 30]

(Также хочу, чтобы это были не строки)

Я попытался разграничить по

cuts[i] = cuts[i].strip(",") 

думая, что это дало бы мне [[3] [5] [10]], который позволил бы мне добавить с цикл, но питон сказал мне списки не имеют атрибут полосы

+1

Ваш последний список в списке списков - это пустой список. Это намеренно? –

ответ

1

Вот списочные в основной форме:

data = [['3', '5', '10'], ['2', '8', '15'], ['7', '9', '25'], ['4', '6', '20'], 
     ['9', '12', '50'], ['5', '7', '22'], ['3', '8', '17'], ['6', '9', '24'], 
     ['8', '11', '40'], ['7', '10', '30'], []] 

a = [int(x[0]) for x in data if len(x) >= 1] 
b = [int(x[1]) for x in data if len(x) >= 2] 
c = [int(x[2]) for x in data if len(x) >= 3] 

print a 
print b 
print c 

Или, чтобы держать их в 2-мерном списке:

abc = [[int(x[i]) for x in data if len(x) >= i+1] for i in range(len(data[0]))] 
print abc 

Выход:

[[3, 2, 7, 4, 9, 5, 3, 6, 8, 7], 
[5, 8, 9, 6, 12, 7, 8, 9, 11, 10], 
[10, 15, 25, 20, 50, 22, 17, 24, 40, 30]] 
+1

, или вы можете свести a, b, c к этому 'a, b, c = ([int (x [i]) для x в данных, если len (x)> = i + 1] для i в диапазоне (len (данные [0]))) ' – KronoS

+0

Совершенно верно. Я передал ему одну технику; это еще один хороший, который есть в его наборе инструментов для программирования. – Prune

0

Я предполагаю, что пустой список в конце cuts опечатка - в противном случае ваши требования не совсем имеет смысла, так как там не первый, второй и третий элемент пустого списка. Вы всегда можете использовать

cuts = [cut for cut in cuts if len(cut) > 0] 

если вы хотите отрезать разрезы до размера.

В любом случае, как только что пустой список удаляется, что вы просите за это своего рода zip и может быть сделано как таким образом:

>>> cuts = [['3', '5', '10'], ['2', '8', '15'], ['7', '9', '25'], ['4', '6', '20'], ['9', '12', '50'], ['5', '7', '22'], ['3', '8', '17'], ['6', '9', '24'], ['8', '11', '40'], ['7', '10', '30']] 
>>> a,b,c = ([int(s) for s in strings] for strings in zip(*cuts)) 
>>> a 
[3, 2, 7, 4, 9, 5, 3, 6, 8, 7] 
>>> b 
[5, 8, 9, 6, 12, 7, 8, 9, 11, 10] 
>>> c 
[10, 15, 25, 20, 50, 22, 17, 24, 40, 30] 
1

Это может быть сделано с помощью встроенного в zip функции.

a, b, c = zip(*cuts) 

Вы можете прочитать о zip here. Суть здесь -

эта функция возвращает список кортежей, где я-й кортеж содержит I-й элемент из каждого из аргументов последовательностей или итерируемыми

Если после этого вы хотите ваши списки для хранения чисел вместо строк, вы можете сопоставить их по функции int.

a = map(int, a) 
b = map(int, b) 
c = map(int, c) 
+0

Трудно не любить элегантный 1-лайнер, как 'a, b, c = zip (* cuts)'.Кроме того, я думаю, что в этом случае ваше использование «карты» более читаемо, чем соответствующее понимание. –

Смежные вопросы