Получение первой и второй "колонки" из пары списков
У меня есть много пар списков переменной длины (5,4,6 пар и т. д..) внутри одного большого списка назовем его LIST
. Вот два списка среди множества внутри большого списка в качестве примера:
[(38.621833, -10.825707),
(38.572191, -10.84311), -----> LIST[0]
(38.580202, -10.860877),
(38.610917, -10.85217),
(38.631526, -10.839338)]
[(38.28152, -10.744559),
(38.246368, -10.744552), -----> LIST[1]
(38.246358, -10.779088),
(38.281515, -10.779096)]
Мне нужно создать две отдельные переменные, скажем, из которых одна переменная будет иметь first "column"
(то есть список[0][0][0], LIST[0][1][0] и т. д.) всех пар списков (например, 38.621833, 38.572191 и т. д.) И вторая переменная будет иметь second "column"
(т. е. Список[0][0][1], Список[0][1][1] и так далее) всех пар списков.
Итак, наконец, у меня будут две переменные (скажем,x, y), которые будут содержать все значения первого и второго "столбцов" всех списков в списке.
Проблема, с которой я сталкиваюсь, заключается в том, что все эти списки не одинаковой длины!!Я пытался
x = []
y = []
for i in range(len(LIST)):
x.append(LIST[i][0][0]) #append all the values of the first numbers
y.append(LIST[i][1][1]) #append all the values of the second numbers
Чего я ожидаю:
x = (38.621833,38.572191,38.580202,38.610917,38.631526,38.28152,38.246368,38.246358,38.281515)
y = (-10.825707,-10.84311,-10.860877,-10.85217,-10.839338,-10.744559,-10.744552,-10.779088,-10.779096)
Но здесь из-за пар переменных мой цикл резко останавливается между ними.
Я знаю I need to also change the LIST[i][j][0]
здесь и j
изменения с каждым списком. Но из-за разных пар я не знаю, как себя вести.
Как мне это сделать?
5 ответов:
Я бы использовал два простых цикла
for
(это также универсально дляLIST
длиннее 2):x=[] y=[] for i in range(len(LIST)): for j in LIST[i]: x.append(j[0]) y.append(j[1])
Вы должны транспонировать подсписки и использовать itertool.цепочка для создания единого списка:
from itertools import chain zipped = [zip(*x) for x in l] x, y = chain.from_iterable(ele[0] for ele in zipped),chain.from_iterable(ele[1] for ele in zipped) print(list(x),list(y)) [38.621833, 38.572191, 38.580202, 38.610917, 38.631526, 38.28152, 38.246368, 38.246358, 38.281515] [-10.825707, -10.84311, -10.860877, -10.85217, -10.839338, -10.744559, -10.744552, -10.779088, -10.779096] for ele1,ele2 in zip(x,y): print(ele1,ele2) 38.621833 -10.825707 38.572191 -10.84311 38.580202 -10.860877 38.610917 -10.85217 38.631526 -10.839338 38.28152 -10.744559 38.246368 -10.744552 38.246358 -10.779088 38.281515 -10.779096
Вот, пожалуйста.
tuple
как и было предложено.my = [(38.621833, -10.825707),(38.572191, -10.84311),(38.580202, -10.860877),(38.610917, -10.85217),(38.631526, -10.839338)] my1 = [(38.28152, -10.744559),(38.246368, -10.744552),(38.246358, -10.779088),(38.281515, -10.779096)] l1 = map(tuple,zip(*my))[0] l2 = map(tuple,zip(*my))[1] print l1,l2
Вывод:
(38.621833, 38.572191, 38.580202, 38.610917, 38.631526)(-10.825707, -10.84311, -10.860877, -10.85217, -10.839338)
Используйте функцию
map
с операторомzip
и*
stuple.l = [(38.621833, -10.825707), (38.572191, -10.84311), (38.580202, -10.860877), (38.610917, -10.85217), (38.631526, -10.839338)] x= map(list, zip(*l))[0] y = map(list, zip(*l))[1] print 'x = {},\n y = {}' .format(x,y) x = [38.621833, 38.572191, 38.580202, 38.610917, 38.631526], y = [-10.825707, -10.84311, -10.860877, -10.85217, -10.839338]
Или если вы не хотите хранить его в переменных, то d0n не использовать индексацию в приведенном выше решении,
map(list, zip(*l)) # will give you a nested list
Ваш список расширяется из 2 списков. С
for i in range(len(LIST)):
Вы выполняете ровно 2 раза через свой цикл.
Если вы хотите решить вашу проблему с for-петлями, вам нужно вложить их:
#declare x, y as lists x = [] y = [] for i_list in LIST: #outer for-loop runs 2 times - one for each list appended to LIST. #1st run: i_list becomes LIST[0] #2nd run: i_list becomes LIST[1] for touple in i_list: #inner for-loop runs as often as the number of tuple appended to i_list #touple becomes the content of i_list[#run] x.append(touple[0]) #adds x-value to x y.append(touple[1]) #adds y-value to y
Если вы предпочитаете работать с индексами, используйте:
for i in range(len(LIST)): for j in range(len(LIST[i])): x.append(LIST[i][j][0]) y.append(LIST[i][j][1]])
Не работа с индексами для добавления x-или y-значений намного проще в написании (сохраняет сложные мысли о структуре списка и правильном использовании индексов) и гораздо более понятна для внешних людей читаю ваш код.