2014-12-04 80 views
2

對不起,如果我得到的術語錯誤 - 我只是剛剛開始學習Python,而且我接受來自朋友的指令而不是實際的課程。數組中的搜索元素

我想搜索一個包含大量包含多個元素的數組的列表,並找到一些元素匹配的數組,但有一些不同。

在較不混淆的術語例如我有各自包含2個元素的陣列(我認爲這就是所謂的2D陣列?),以便列表:

list = [[1, 2], [2, 2], [3, 5], [4, 1], [5, 2], ...] 

以我具體實例中,每一子陣列中的第一元件剛上升線性,但是第二元素幾乎是隨機的。我想僅通過第二個數字查找或排序數組。我可以從每個數組中刪除第一個數字:

list = [2, 2, 5, 1, 2 ...] 

然後使用類似「如果list [X] == 1」發現「1」等
(邊注:我不是確定如果重複一個值,如何找到所有的值 - 我不記得我寫的是什麼,但它只會找到第一個匹配值的實例,例如它會檢測到第一個'2',而不是第二個或第三個)

但我想保留每個數組中的第一個值。我的朋友告訴我,你可以用一個帶有值和鍵的字典,這對我的例子很有用,但我想知道更一般的方法是什麼。

所以在我的例子,我希望如果我寫這樣的:

if list[[?, x]] == [?, 1] 

然後它會找到數組,其中數組的第二個值是1,(即[4,1]在我的例子)而不關心第一個值。顯然它沒有工作,因爲'?'就我所知,它不是Python語法,但希望你能看到我正在嘗試做什麼?

因此,對於更一般的情況下,如果我有5個維數組列表,我想找到每個陣列的第二和第四值,我會寫:

if list[[?, x, ?, y, ?]] == [?, a, ?, b, ?] 

而且,它還將匹配任何其中第二個元素的值爲'a',第四個元素的值爲'b'。

例如[3,a,4,b,7],[20,a,1,b,9],['cat',a,'dog',b,'fish']等都是可能的結果。命令。

所以我想知道是否有任何類似的方式來使用問號(但實際工作)的方法來表示數組中的元素可以有任何價值。

+0

你是什麼意思的「數組」:一個Python'array.array',一個Python列表或'numpy.ndarray'? – Evert 2014-12-04 13:45:03

+0

「我認爲這叫做2D陣列?」在這裏,我將它稱爲列表清​​單。如果你想要更適合的2D陣列,請使用'numpy'。 – Evert 2014-12-04 13:45:53

+1

另一個命令:*從不*使用變量名稱的內置關鍵字(即,在這裏不要使用'list'作爲變量)。 – Evert 2014-12-04 13:47:04

回答

1

使用sorted如果你想保持原來的list不受影響

lst = [[1, 2], [2, 2], [3, 5], [4, 1], [5, 2]] 
In [103]: sorted(lst, key=lambda x: x[1]) 
Out[103]: [[4, 1], [1, 2], [2, 2], [5, 2], [3, 5]] 

使用別的list.sort排序當前列表中,並保持排序列表

In [106]: lst.sort(key=lambda x: x[1]) 
In [107]: lst 
Out[107]: [[4, 1], [1, 2], [2, 2], [5, 2], [3, 5]] 

或使用operator.itemgetter

from operator import itemgetter 
In [108]: sorted(lst, key=itemgetter(1)) 
Out[108]: [[4, 1], [1, 2], [2, 2], [5, 2], [3, 5]] 
0

你可以使用list comprehension構建所有期望項的列表:

In [16]: seq = [[1, 2], [2, 2], [3, 5], [4, 1], [5, 2]] 

要查找所有項,其中第二元素是1:

In [17]: [pair for pair in seq if pair[1] == 1] 
Out[17]: [[4, 1]] 

此發現的所有項目,其中所述第二元件是2:

In [18]: [pair for pair in seq if pair[1] == 2] 
Out[18]: [[1, 2], [2, 2], [5, 2]] 

而不是

if list[[?, x, ?, y, ?]] == [?, a, ?, b, ?] 

你可以使用

[item for item in seq if item[1] == 'a' and item[3] == 'b'] 

注意,但是,每次使用列表理解,Python有循環 通過所有seq的元素。如果你正在做這個搜索多次, 你可能會更好建設的字典:

import collections 
seq = [[1, 2], [2, 2], [3, 5], [4, 1], [5, 2]] 
dct = collections.defaultdict(list) 
for item in seq: 
    key = item[1] 
    dct[key].append(item) 

然後你可以訪問的項目是這樣的:

In [22]: dct[1] 
Out[22]: [[4, 1]] 

In [23]: dct[2] 
Out[23]: [[1, 2], [2, 2], [5, 2]] 

列表內涵

[pair for pair in seq if pair[1] == 1] 

大致相當於

result = list() 
for pair in seq: 
    if pair[1] == 1: 
     result.append(pair) 

從這個意義上說,result將然後等於列表理解。

列表理解只是一種語法上更漂亮的方式來表達相同的 的東西。

上面的列表理解有三個部分:

[expression for-loop conditional] 

表達是pair,for循環是for pair in seq,和條件是if pair[1] == 1

大多數,but not all列表解析共享此語法。完整的列表理解語法是given here

+0

謝謝你的回覆。 你能打破什麼「物品項目在seq如果項目」是什麼意思? (如果配對的話,如果配對的話,「如果配對的意思是什麼,如果這是不同的?) 是的,我提到我的朋友曾經簡單地告訴我有關字典,但從我可以告訴的是,它看起來像它們的使用僅限於2D列表和其中一個元素線性增加的值 - 即一個2D列表,其中兩個變量在每個子列表中都是隨機的將不起作用,因爲對於給定的鍵可以有多個或零匹配... – Patrik333 2014-12-04 14:55:51

+0

I'我添加了對列表理解語法的解釋。請務必閱讀文檔的鏈接以獲取更完整的解釋。 – unutbu 2014-12-04 15:08:44

2

排序在第二元件上爲方含列表(或元組)的列表:

from operator import itemgetter 
mylist = [[1, 2], [2, 2], [3, 5], [4, 1], [5, 2]] 
sortedlist = sorted(mylist, key=itemgetter(1)) 

Python sorting howto

+0

感謝您的回覆。這究竟做什麼/你如何使用這個功能?我試圖用更多的「基本」步驟代替更強大的功能 - 我設法通過搜索「模式」功能來解決我朋友的挑戰(即「找到隨機列表的模式」),我的整個程序只有3行,但我只想使用我的朋友向我展示的更簡單的函數(for循環,if語句等)來嘗試它。 – Patrik333 2014-12-04 14:40:50

+0

簡單的書寫功能對學習算法來說很好,但如果你想學習Python和編程,保持簡短和易於理解可能更適合。有時,一個句子直接轉換爲一行Python代碼:「找到一個隨機列表的模式」 - >'scipy.stats.mstats.mode(data)'。所以這裏的答案取決於你的學習上下文:StackOverflow是爲實際問題的實際答案,而例如[程序員](http://programmers.stackexchange.com/questions/tagged/algorithms)可能會幫助你解決算法問題。 – Evert 2014-12-04 14:50:11

+0

我不知道,我想學習編程,但是當我寫東西的時候,我想知道它是如何工作的。我的父親也是一名程序員,曾經告訴過我它是如何一直運行到二進制/機器代碼的 - 我想我不想去那麼遠,但感覺就像插入一個函數一個完整的程序本身,而沒有研究出實際的功能。我想我理解我的朋友的挑戰是「編寫一個程序來查找列表的模式」,所以只使用模式函數不會編寫我自己的程序,它只是使用其他人的預先編寫的程序 – Patrik333 2014-12-04 15:13:47