搜索数组数组中的元素

时间:2014-12-04 13:42:42

标签: python arrays

很抱歉,如果我的术语出错了 - 我刚开始学习Python,而且我正在接受朋友的指导而不是参加实际的课程。

我想搜索包含大量包含多个元素的数组的列表,并找到一些元素匹配的数组,但有些不同。

以较少混淆的方式,例如我有一个数组列表,每个数组包含2个元素(我认为这称为2D数组?)所以:

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

在我的具体示例中,每个子数组中的第一个元素只是线性上升,但第二个元素几乎是随机的。我想只通过第二个数字查找或排序数组。我可以从每个数组中删除第一个数字:

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

然后使用类似“if list [x] == 1”的内容来查找“1”等 (旁注:我不知道如果重复一个值,如何找到所有值 - 我不记得我写的很多,但它只会找到值匹配的第一个实例,所以例如它会检测到第一个'2'但不是第二个或第三个)

但我想保留每个数组中的第一个值。我的朋友告诉我你可以使用带有值和键的字典,这对我的例子很有用,但我想知道更通用的方法是什么。

所以在我的例子中,我希望如果我写下这个:

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

然后它会找到数组的第二个值为1的数组(在我的例子中为[4,1])而不关心第一个值。显然它没有用,因为'?'据我所知,这不是Python语法,但希望你能看到我正在尝试做什么?

因此,对于更一般的情况,如果我有一个5维数组的列表,并且我想找到每个数组的第二个和第四个值,我会写:

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

它匹配任何第二个元素的值为'a'的数组,第四个元素的值为'b'。

e.g。 [3,a,4,b,7],[20,a,1,b,9],['cat',a,'dog',b,'fish']等都将成为可能的结果命令。

所以我想知道我使用问号的方法是否有任何类似的方法(但实际上有效)表示数组中的元素可以有任何值。

3 个答案:

答案 0 :(得分: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

答案 1 :(得分: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]]

答案 2 :(得分: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