2012-12-03 139 views
-2

假設我有一個列表x = [1,2,3],我想輸出除索引的每一個其他值,是否有列表操作我可以使用?,即:x [0] => [2,3],x [1] => [1,3],x [2] => [1,2]?列表切片python每隔一個值

回答

-3

每隔是

x[::2], start at 0 
x[1::2], start at 1 
+1

問題不是「所有其他」,因爲在步驟中,問題是「除提供的索引之外的所有其他值」。 –

+1

我差點發布這個答案太哈哈。 –

+1

我的不好,我猜不應該在照料廚房時回答問題。 – arynaq

0
>>> x = [1, 2, 3] 
>>> x[:1] + x[2:] 
[1, 3] 
-2

所以,你想除了索引值,每個值: 其中i是指數:

>>> list = [1,2,3,4,5,6,7,8] 
>>> [x for x in list if not x == list[i]] 

這會給你沒有實例列表的元素,例如:

>>> i = 2 
>>> list = [1,2,3,4,5,6,7,1,2,3,4,5,6,7] 
>>> [x for x in list if not x == list[i]] 
[1, 2, 4, 5, 6, 7, 1, 2, 4, 5, 6, 7] 

注意3根本不在該列表中。

+0

看到我對這個問題上的其他回覆答案的評論。 –

+0

我更新了我的答案以反映問題的實際意圖。 –

+1

這仍然是不正確的,因爲當列表重複元素時它失敗。 –

1

你可以使用x[:i] + x[i+1:]

In [8]: x = [1, 2, 3] 

In [9]: i = 0 

In [10]: x[:i] + x[i+1:] 
Out[10]: [2, 3] 

根據上下文,x.pop(i)也可能是有用的。它通過刪除並返回i-th元素來修改列表。如果你不需要這個元素,del x[i]也是一個選項。

+0

'x.pop(i)'返回元素,如果你不需要,那麼就使用'del x [i]'。 –

+0

@Lattyware:好點,謝謝! – NPE

5

您可以使用此:

def exclude(l, e): 
    return [v for i, v in enumerate(l) if i != e] 

>>> exclude(range(10), 3) 
[0, 1, 2, 4, 5, 6, 7, 8, 9] 
+0

+1。這可能比切片方法更快,因爲它不會創建並丟棄兩個中間列表。順便說一句,很好的選擇功能名稱。 –

+0

@StevenRumbalski - 謝謝!內部變量名稱很短,但爲了快速寫出,它似乎很好。 –

+1

我們可以用'!='來代替'<>'但請:) :) –

4

你可以用切片做到這一點,但我會忍不住去嘗試:

a = [1, 2, 3] 
b = a[:] 
del b[1] 

編輯

上面並「技術上」使用切片操作,恰好在list對象上實際上是淺拷貝。

更重要的是靈活的,應該不會有什麼缺點是使用:

a = [1, 2, 3] 
b = list(a) 
del b[1] 

名單內置適用於任何可迭代(而切片操作[:]作品的列表或那些可轉位),這樣你甚至可以將其擴展到結構,如:

>>> a = '123' 
>>> b = list(a) 
>>> del b[0] 
>>> ''.join(b) 
'23' 
+0

我認爲這是最明智的選擇,說實話。它非常清楚發生了什麼並且非常簡單。 –

+0

這在技術上也是按照您所寫的方式使用切片。 –

+0

@MarkByers如果你願意(我真的覺得是更好的複製方法),你可以很容易地用'list(a)'複製列表。 –

-1
my_list = [1, 2, 3] 
my_list.remove(my_list[_index_]) #_index_ is the index you want to remove 

使得:my_list.remove(my_list[0])將產生[2, 3]my_list.remove(my_list[1])會產生[0, 3], my_list.remove(my_list[2])會產生[1, 2]

+0

編輯:我現在看到你想說什麼,如果有重複的值,這是不正確的,它會就地影響列表。 –