Найти - Пользователи
Полная версия: Проблема с созданием списка
Начало » Python для новичков » Проблема с созданием списка
1
treporan
Доброго времени всем! Прошу вас о помощи. Задача состоит в следующем: получить список заданной длины (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
K1 = ('a','b','b')
K2 = ('A','B','C')
K3 = ('1','2','3')
T = []
for vals in zip(K1, K2, K3):
    T.extend(vals)
treporan
Уважаемый (-ая), 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
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
Большущее спасибо за помощь. Прекрасно работает с кортежами одинаковой длины.
Правда, у меня длины кортежей разные: len(K1) = len(K2) = 26, len(K3) = 10. Пытаюсь сейчас разобраться.
malya
Приведите полный ваш код, с вашими переменными и кортежами разной длины.
И так как вы проходите, будем говорить по столбцам кортежей, что у вас должно быть если в каком-то столбце не будет значения (т.е. это будет самый короткий кортеж)?
malya
Сделал два решения:
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
Первый вариант можно переделать так:
def transpose(*args):
    L = []
    for tups in map(None, *args):
        L.extend(list(tups)) # или L += list(tups)
    return filter(None, L)
sanodin
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]#ошибка
malya
Я имел ввиду не про этот (
print L[:length]
) выход за пределы списка, а про тот который может вылезти если lenth будет длинее транспонированного списка который формируется в процедуре.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB