понимание списка элементов разной длины - PullRequest
1 голос
/ 01 апреля 2019

Некоторые элементы в моем списке немного длиннее и требуют другого подхода. Этот список выглядит так:

a = [['red', 'square', 'up'], ['red', 'circle'], 
     ['blue', 'triangle'], ['blue', 'square'], 
     ['blue', 'octagon'], ['blue', 'diamond', 'down']]

Я почти могу заставить его делать то, что я хочу, вот так:

[[x[0], x[1] + 's'] for x in a]

, что дает

[['red', 'squares'],
 ['red', 'circles'],
 ['blue', 'triangles'],
 ['blue', 'squares'],
 ['blue', 'octagons'],
 ['blue', 'diamonds']]

но это теряет информацию от более длинных элементов. Желаемый вывод:

[['red', 'squares', 'up1'], ['red', 'circles'], 
['blue', 'triangles'], ['blue', 'squares'], 
 ['blue', 'octagons'], ['blue', 'diamonds', 'down1']]

Просто делаю это

[[x[0], x[1] + 's', x[2] + '1'] for x in a]

... неудивительно, что приводит к ошибке:

IndexError: list index out of range

Есть идеи, как это сделать?

Ответы [ 4 ]

3 голосов
/ 01 апреля 2019

Вы можете использовать функцию zip():

a = [['red', 'square', 'up'],
     ['red', 'circle'],
     ['blue', 'triangle'],
     ['blue', 'square'],
     ['blue', 'octagon'],
     ['blue', 'diamond', 'down']]

endings = ['', 's', '1']

[[i + j for i, j in zip(i, endings)] for i in a]

Результат:

[['red', 'squares', 'up1'],
 ['red', 'circles'],
 ['blue', 'triangles'],
 ['blue', 'squares'],
 ['blue', 'octagons'],
 ['blue', 'diamonds', 'down1']]
2 голосов
/ 01 апреля 2019

Вы получили ошибку, потому что иногда ваш x имеет 2 элементов, а иногда 3. Я изменил ваш код, чтобы справиться с этим:

a = [['red', 'square', 'up'], ['red', 'circle'], 
     ['blue', 'triangle'], ['blue', 'square'], 
     ['blue', 'octagon'], ['blue', 'diamond', 'down']]
t = [[x[0], x[1] + 's'] if len(x) == 2 else [x[0], x[1] + 's', x[2] + '1'] for x in a]
print(t)

Выход:

[['' red ',' squares ',' up1 '], [' red ',' circle '], [' blue ',' треугольники '], [' blue ',' squares '], [' синий ',' восьмиугольник '], [' синий ',' алмазы ',' вниз1 ']]

1 голос
/ 01 апреля 2019

Получите len() каждого elem в list и манипулируйте соответственно:

Для понимания :

a = [['red', 'square', 'up'], ['red', 'circle'],
     ['blue', 'triangle'], ['blue', 'square'],
     ['blue', 'octagon'], ['blue', 'diamond', 'down']]

for elem in a:
    if len(elem) < 3:
        print([elem[0], elem[1] + "s"])
    else:
        print([elem[0], elem[1] + "s " + elem[2]+ "1"])

ВЫХОД :

['red', 'squares up1']
['red', 'circles']
['blue', 'triangles']
['blue', 'squares']
['blue', 'octagons']
['blue', 'diamonds down1']

Использование list-comprehension:

print([[x[0], x[1] + 's'] if len(x) < 3 else [x[0], x[1] + 's', x[2] + '1'] for x in a])
0 голосов
/ 01 апреля 2019

Это сработало для меня, если вы хотите проверить, имеет ли вложенный список len> 2:

[[x[0], x[1] + 's'] if len(x) == 2 else [x[0], x[1]+'s', x[2]+'1'] for x in a]

Вывод:

[['red', 'squares', 'up1'],
 ['red', 'circles'],
 ['blue', 'triangles'],
 ['blue', 'squares'],
 ['blue', 'octagons'],
 ['blue', 'diamonds', 'down1']]
...