2015-02-23 2 views
0

Почему не Python позволяет этот синтаксис:Почему вы не можете индексировать список python со списком индексов?

l1 = range(1,6) 
l2 = [0,3] 
l1[l2] 

Я бы ожидать, что последняя линия для производства

[1,4] 

Я понимаю, что я могу сделать это с списковых (согласно Getting a sublist of a Python list, with the given indices?) , но приведенный выше синтаксис кажется естественным amd работает с np.arrays, и я предполагаю, что у них есть веская причина запретить его в python; что это?

+5

Спросите Гвидо. Я не думаю, что «почему не была реализована функция X» - это хороший вопрос для stackoverflow. – Blorgbeard

+1

Почему вы предполагаете, что все, что вы думаете, хорошая идея, должно существовать? Эта функция не найдена на многих языках, возможно, комитет не хочет добавлять путаницу. Трудность добавления этой функции сегодня может быть интересным вопросом, хотя и о внутренних компонентах Python. –

+0

Не кажется мне естественным, никогда не видел эти обозначения за пределами Матлаба и Нэнси. Что ты спрашиваешь? Кто-то действительно считал, что добавляет, что во время разработки Python? Об этом нет [предложение для расширения] (https://www.python.org/dev/peps/). – Kos

ответ

1

Python не поддерживает этот синтаксис, потому что он не поддерживает этот синтаксис. Если не считать ошибок, Guido van Rossum, это лучший ответ, который вы получите.

Легко добавить к list подкласса, хотя:

class List(list): 
    def __getitem__(self, index): 
     try: 
      return list.__getitem__(self, index) 
     except TypeError: 
      return List(self[i] for i in index) 
    def __setitem__(self, index, value): 
     try: 
      return list.__setitem__(self, index, value) 
     except TypeError: 
      value = iter(value) 
      for i in index: 
       self[i] = next(value) 

a = List(range(10)) 
a.reverse() 
print(a[1, 3, 5]) # [8, 6, 4] 
a[1, 3, 5] = 1, 2, 3 
print(a)    # [9, 1, 7, 2, 5, 3, 3, 2, 1, 0] 

__setitem__ не ведет себя хорошо, когда у вас есть больше значений, чем слоты вы заполняющих (это, вероятно, следует дать вам ошибку), но это сложно сделать, а также поддерживать генераторы, так что, meh.

Тривиальность его реализации может иметь отношение к тому, что он не является частью языка; __getitem__ - это просто простое понимание списка (или выражение генератора в этом случае), которое вы могли бы просто написать в своем собственном коде везде, где вам нужно было это сделать.

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