Форум сайта python.su
Доброго времени всем! Прошу вас о помощи. Задача состоит в следующем: получить список заданной длины (length), содержащий элементы из 3-ех кортежей. Элементы добавляются в список по одному из каждого кортежа за один проход. OS: Ubuntu 12.04 (precise), Python 3.2.3
Пытаюсь сделать что-то вроде этого, но постоянно получаю ошибку (длины кортежей учитываются):
x = 0
while length:
T.append(K1)
length -=1
L.append(K2)
length -=1
L.append(K3)
length -=1
x += 1
Входные данные:
K1 = ('a','b','b')
K2 = ('A','B','C')
K3 = ('1','2','3')
T = пустой список
length = 10 # длина результирующего списка
T = ‘a’,'A','1','b','B','2','c','C','3','d' # так должен выглядеть результрующий список.
Заранее благодарен.
Отредактировано treporan (Сен. 12, 2013 08:22:04)
Офлайн
K1 = ('a','b','b') K2 = ('A','B','C') K3 = ('1','2','3') T = [] for vals in zip(K1, K2, K3): T.extend(vals)
Отредактировано malya (Сен. 12, 2013 10:04:09)
Офлайн
Уважаемый (-ая), malya, спасибо за ответ, но задача, все-таки пока не решена. Возможно, я не совсем правильно объяснил, что мне нужно. Попытаюсь уточнить.
Алгоритм следующий: x,y,z (индексы) равны 0, длина = True, в список добавляется элемент с индексом x из К1, длина уменьшается на 1, в список добавляется элемент с индексом y из К2, длина уменьшается на 1, в список добавляется элемент с индексом z из К3, длина уменьшается на 1, x,y,z увеличиваются на единицу, проверка x,y,x (если они равны длине соответствующей последовательности, то обнуление) и в начало.
Ожидал получить следующее:
вводим длину 5 => должны получить aA1bB
вводим длину 7 => должны получить aA1bB2с
итак далее
Но постоянно получаю ошибку.
Офлайн
K1 = ('a','b','b') K2 = ('A','B','C') K3 = ('1','2','3') x = 5 T = [] for vals in zip(K1, K2, K3): for val in vals: if x: T.append(val) x -= 1
Отредактировано malya (Сен. 12, 2013 11:06:11)
Офлайн
Большущее спасибо за помощь. Прекрасно работает с кортежами одинаковой длины.
Правда, у меня длины кортежей разные: len(K1) = len(K2) = 26, len(K3) = 10. Пытаюсь сейчас разобраться.
Офлайн
Приведите полный ваш код, с вашими переменными и кортежами разной длины.
И так как вы проходите, будем говорить по столбцам кортежей, что у вас должно быть если в каком-то столбце не будет значения (т.е. это будет самый короткий кортеж)?
Офлайн
Сделал два решения:
1.
K1 = ('a','b','b','z') K2 = ('A','B','C','y') K3 = ('1','2','3') def transpose(*args): L = [] for tups in map(None, *args): for val in tups: L.append(val) return filter(None, L) L = transpose(K1, K2, K3) length = 5 print L[:length]
K1 = ('a','b','b','z') K2 = ('A','B','C','y') K3 = ('1','2','3') def transpose1(*args): return filter(None, [val for tups in map(None, *args) for val in tups]) L = transpose1(K1, K2, K3) length = 5 print L[:length]
Отредактировано malya (Сен. 13, 2013 14:44:54)
Офлайн
Первый вариант можно переделать так:
def transpose(*args): L = [] for tups in map(None, *args): L.extend(list(tups)) # или L += list(tups) return filter(None, L)
Отредактировано malya (Сен. 13, 2013 15:04:56)
Офлайн
malya
print L
L[:length]
a = [1,2,3] print (a[0:1]) # [1] print (a[1:2]) # [2] print (a[4:5]) # [] print a[4]#ошибка
Отредактировано sanodin (Сен. 14, 2013 10:41:02)
Офлайн
Я имел ввиду не про этот (
print L[:length]
Отредактировано malya (Сен. 15, 2013 19:41:01)
Офлайн