Уведомления

Группа в Telegram: @pythonsu

#1 Сен. 12, 2013 08:17:01

treporan
Зарегистрирован: 2013-09-12
Сообщения: 3
Репутация: +  0  -
Профиль   Отправить e-mail  

Проблема с созданием списка

Доброго времени всем! Прошу вас о помощи. Задача состоит в следующем: получить список заданной длины (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)

Офлайн

#2 Сен. 12, 2013 10:03:42

malya
От:
Зарегистрирован: 2012-01-11
Сообщения: 49
Репутация: +  1  -
Профиль   Отправить e-mail  

Проблема с созданием списка

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)

Офлайн

#3 Сен. 12, 2013 10:51:30

treporan
Зарегистрирован: 2013-09-12
Сообщения: 3
Репутация: +  0  -
Профиль   Отправить e-mail  

Проблема с созданием списка

Уважаемый (-ая), 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с
итак далее
Но постоянно получаю ошибку.

Офлайн

#4 Сен. 12, 2013 11:03:13

malya
От:
Зарегистрирован: 2012-01-11
Сообщения: 49
Репутация: +  1  -
Профиль   Отправить e-mail  

Проблема с созданием списка

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)

Офлайн

#5 Сен. 13, 2013 08:00:25

treporan
Зарегистрирован: 2013-09-12
Сообщения: 3
Репутация: +  0  -
Профиль   Отправить e-mail  

Проблема с созданием списка

Большущее спасибо за помощь. Прекрасно работает с кортежами одинаковой длины.
Правда, у меня длины кортежей разные: len(K1) = len(K2) = 26, len(K3) = 10. Пытаюсь сейчас разобраться.

Офлайн

#6 Сен. 13, 2013 11:01:48

malya
От:
Зарегистрирован: 2012-01-11
Сообщения: 49
Репутация: +  1  -
Профиль   Отправить e-mail  

Проблема с созданием списка

Приведите полный ваш код, с вашими переменными и кортежами разной длины.
И так как вы проходите, будем говорить по столбцам кортежей, что у вас должно быть если в каком-то столбце не будет значения (т.е. это будет самый короткий кортеж)?



Офлайн

#7 Сен. 13, 2013 14:34:04

malya
От:
Зарегистрирован: 2012-01-11
Сообщения: 49
Репутация: +  1  -
Профиль   Отправить e-mail  

Проблема с созданием списка

Сделал два решения:
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 14:44:54)

Офлайн

#8 Сен. 13, 2013 15:01:26

malya
От:
Зарегистрирован: 2012-01-11
Сообщения: 49
Репутация: +  1  -
Профиль   Отправить e-mail  

Проблема с созданием списка

Первый вариант можно переделать так:

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)

Офлайн

#9 Сен. 14, 2013 08:03:03

sanodin
От:
Зарегистрирован: 2011-06-16
Сообщения: 515
Репутация: +  31  -
Профиль   Отправить e-mail  

Проблема с созданием списка

malya
print L
L[:length]
Здесь вывод уже подразумевает безошибочный , даже если элементы будут отсутствовать, ошибки 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]#ошибка

Отредактировано sanodin (Сен. 14, 2013 10:41:02)

Офлайн

#10 Сен. 15, 2013 19:40:19

malya
От:
Зарегистрирован: 2012-01-11
Сообщения: 49
Репутация: +  1  -
Профиль   Отправить e-mail  

Проблема с созданием списка

Я имел ввиду не про этот (

print L[:length]
) выход за пределы списка, а про тот который может вылезти если lenth будет длинее транспонированного списка который формируется в процедуре.



Отредактировано malya (Сен. 15, 2013 19:41:01)

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version