2014-11-06 3 views
-1

Я использую Python 2.7.xTransform вложенную операцию списка в выражение список понимания

Моя проблема:

У меня есть список списков, как показано ниже:

a = [[1,3,2,8],[2,1,4,5],[3,2,4],[4,2,3,5]] 

Теперь для всех элементов со значением say 2, я хочу изменить их на 9, за исключением первого значения каждого подсписок. То есть:

for sublist in a: 
    for i in range(1, len(sublist)): 
     if sublist[i] == 2: 
      sublist[i] = 9 

Так что теперь

a = [[1,3,9,8],[2,1,4,5],[3,9,4],[4,9,3,5]] 

Так или иначе, я не могу поставить этот код в режиме списка понимания.

+0

Почему вы хотите этого? Ваш код в порядке. Понимание воссоздает всю структуру - довольно пустая память, если вам нужно всего лишь заменить несколько цифр. – georg

+0

Перечисление списков в python красиво и полезно только при удобном использовании. Не существует правила, согласно которому каждая маленькая петля должна быть преобразована в понимание. В коде нет ничего плохого. –

ответ

1

Это следует сделать это:

[[9 if val == 2 and i > 0 else val for i, val in enumerate(sublist)] for sublist in a] 

Или, как говорит @BurhanKhalid в комментариях:

[[sublist[0]] + [9 if val == 2 else val for val in sublist[1:]] for sublist in a] 

Выход:

[[1, 3, 9, 8], [2, 1, 4, 5], [3, 9, 4], [4, 9, 3, 5]] 
+0

Вы можете также [[sublist [0] + [9, если val == 2 else val для val в подписок [1:]] для подписок в a] ' –

+0

@BurhanKhalid Cool, вы можете добавить это как еще один ответ. – irrelephant

+0

Его просто улучшение вашего решения, не стесняйтесь редактировать свой ответ. –

0

Вы можете использовать map, а затем вложенную зацикливание ,

[[lst[0]]+map(lambda x: 9 if x==2 else x, lst[1:]) for lst in a] 
0
>>> a = [[1,3,2,8],[2,1,4,5],[3,2,4],[4,2,3,5]] 
>>> [[j if j!=2 else 9 for j in i] for i in a] 
[[1, 3, 9, 8], [9, 1, 4, 5], [3, 9, 4], [4, 9, 3, 5]] 
Смежные вопросы