2016-05-28 3 views
4

Я пытаюсь сделать следующее в питоне: дан список списков и целое число яPython отобразить значение элемента каждого I-й Подсписка в

input = [[1, 2, 3, 4], [1, 2, 3, 4], [5, 6, 7, 8]] 
i = 1 

Мне нужно, чтобы получить еще один список, который имеет все 1s для элементов г-го списка, 0 в противном случае

output = [0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0] 

Я написал этот код

output = [] 
for sublist in range(0, len(input)): 
    for item in range(0, len(input[sublist])): 
     output.append(1 if sublist == i else 0) 

и, очевидно, работает, бушель t, так как я новичок в python, я полагаю, что есть лучший «питонический» способ сделать это.

Я думал, что использование map может работать, но я не могу получить индекс списка вместе с ним.

ответ

4

Создание дополнительной переменной, чтобы получить индекс текущего элемента в процессе взаимодействия, довольно неряшливо. Обычной альтернативой является использование встроенной функции enumerate.

Верните объект перечисления. последовательность должна быть последовательностью, итератором, или другим объектом, поддерживающим итерацию. Метод next() итератор, возвращаемый enumerate(), возвращает кортеж, содержащий счетчик (начиная с начала, который по умолчанию равен 0), и значения, полученные от , итерации по последовательности.

Вы можете использовать список понимание с двойной петлей внутри него лаконичный один лайнер:

input_seq = [[1, 2, 3, 4], [1, 2, 3, 4], [5, 6, 7, 8]] 
i = 1 
o = [1 if idx == i else 0 for idx, l in enumerate(input_seq) for _ in l] 

В качестве альтернативы,

o = [int(idx == i) for idx, l in enumerate(input_seq) for _ in l] 

Подчеркивание просто холостым имя, так как в этом случае мы не» t заботиться о фактических значениях, хранящихся во входных подсписках.

3

Вот 1-лайнер, но это не совсем очевидно:

output = [int(j == i) for j, sublist in enumerate(input) for _ in sublist] 

Несколько более очевидным:

output = [] 
for j, sublist in enumerate(input): 
    output.extend([int(i == j)] * len(sublist)) 

Тогда "? 0 или 1" вычисляется только один раз в подсписке, что может быть или не быть более эффективным.

+0

Отличный ответ, как другой. Хотел бы я разделить точки. +1 для обоих. – Dean

Смежные вопросы