2015-02-23 59 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?) ,但是我上面列出的語法看起來很自然,並且與np.arrays一起工作,並且我認爲他們在python中有一個很好的理由來阻止它。它是什麼?

+5

問問Guido。我不認爲「爲什麼沒有實現X功能」是一個很好的問題stackoverflow .. – Blorgbeard 2015-02-23 22:50:45

+1

爲什麼你認爲你認爲一切都是一個好主意必須存在?這個功能在許多語言中都沒有找到,或許委員會不想增加混淆。今天添加此功能的困難可能是一個有趣的問題,儘管關於Python內部。 – 2015-02-23 22:51:25

+0

不會讓我感到自然,從未在Matlab和Numpy之外見過這種符號。你在問什麼?是否有人在Python開發過程中實際考慮添加這個項沒有[關於擴展的提議](https://www.python.org/dev/peps/)。 – Kos 2015-02-23 22:52:19

回答

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__不守規矩時,你有更多的價值比你填充插槽(這也許應該給你一個錯誤),但在支持生成器的時候這很難做,所以,呃。

實施它的微不足道可能與它不屬於語言的一部分有關;特別是__getitem__只是一個簡單的列表理解(或本例中的生成器表達式),您可以在自己的代碼中輕鬆編寫任何需要執行的代碼。