нарезка поведения вопрос списка списков - PullRequest
3 голосов
/ 18 марта 2010

У меня есть такая функция, как

def f():
    ...
    ...
    return [list1, list2]

возвращает список списков

[[list1.item1,list1.item2,...],[list2.item1,list2.item2,...]]

теперь, когда я делаю следующее:

for i in range(0,2):print f()[i][0:10]

работает и распечатывает списки нарезанные

но если я сделаю

print f()[0:2][0:10]

затем печатает списки, игнорируя разрезание [0:10].

Есть ли способ заставить работать вторую форму или мне нужно каждый раз зацикливаться, чтобы получить нужный результат?

Ответы [ 3 ]

10 голосов
/ 18 марта 2010

Второй слайс разрезает последовательность, возвращенную из первого слайса, так что да, вам придется как-то зацикливаться, чтобы разрезать внутри:

[x[0:10] for x in f()[0:2]]
7 голосов
/ 18 марта 2010

Причина, по которой эти двое ведут себя по-разному, заключается в том, что f()[0:2][0:10] работает следующим образом:

  1. f() дает вам список списков.
  2. [0:2] дает вам список, содержащий первые два элемента в списке списков. Поскольку элементы в списке списков являются списками, это также список списков.
  3. [0:10] дает вам список, содержащий первые десять элементов в списке списков, который был создан на шаге 2.

Другими словами, f()[0:2][0:10] начинается со списка списков, затем берет подсписок этого списка списков (который также является списком списков), а затем берет подсписок второго списка списков (который также список списков).

Напротив, f()[i] фактически извлекает i -й элемент из вашего списка списков, который является простым списком (не списком списков). Затем, когда вы применяете [0:10], вы применяете его к простому списку, полученному из f()[i], а не к списку списков.

Суть в том, что любое решение, которое дает желаемое поведение, должно будет в какой-то момент обращаться к одному элементу массива, например [i], а не работать только с кусочками, такими как [i:j].

0 голосов
/ 18 марта 2010

Питоническая петля будет:

for list in f()[0:2]:
    print list[0:10]

Но в зависимости от того, чего вы хотите достичь, понимание списка может быть даже лучше.

Или вы используете функцию Pythons map():

def print_sub(x):
    print x[0:10]

map(print_sub, f()[0:2])

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

...