treporan
Сен. 12, 2013 08:17:01
Доброго времени всем! Прошу вас о помощи. Задача состоит в следующем: получить список заданной длины (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' # так должен выглядеть результрующий список.
Заранее благодарен.
malya
Сен. 12, 2013 10:03:42
K1 = ('a','b','b')
K2 = ('A','B','C')
K3 = ('1','2','3')
T = []
for vals in zip(K1, K2, K3):
T.extend(vals)
treporan
Сен. 12, 2013 10:51:30
Уважаемый (-ая), 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с
итак далее
Но постоянно получаю ошибку.
malya
Сен. 12, 2013 11:03:13
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
treporan
Сен. 13, 2013 08:00:25
Большущее спасибо за помощь. Прекрасно работает с кортежами одинаковой длины.
Правда, у меня длины кортежей разные: len(K1) = len(K2) = 26, len(K3) = 10. Пытаюсь сейчас разобраться.
malya
Сен. 13, 2013 11:01:48
Приведите полный ваш код, с вашими переменными и кортежами разной длины.
И так как вы проходите, будем говорить по столбцам кортежей, что у вас должно быть если в каком-то столбце не будет значения (т.е. это будет самый короткий кортеж)?
malya
Сен. 13, 2013 14:34:04
Сделал два решения:
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]
2.
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 15:01:26
Первый вариант можно переделать так:
def transpose(*args):
L = []
for tups in map(None, *args):
L.extend(list(tups)) # или L += list(tups)
return filter(None, L)
sanodin
Сен. 14, 2013 08:03:03
malya
print L
Здесь вывод уже подразумевает безошибочный , даже если элементы будут отсутствовать, ошибки list index out of range не будет, выдаст лишь те элементы которые есть?
a = [1,2,3]
print (a[0:1])
# [1]
print (a[1:2])
# [2]
print (a[4:5])
# []
print a[4]#ошибка
malya
Сен. 15, 2013 19:40:19
Я имел ввиду не про этот (
) выход за пределы списка, а про тот который может вылезти если lenth будет длинее транспонированного списка который формируется в процедуре.