很抱歉,如果我的术语出错了 - 我刚开始学习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']等都将成为可能的结果命令。
所以我想知道我使用问号的方法是否有任何类似的方法(但实际上有效)表示数组中的元素可以有任何值。
答案 0 :(得分:2)
要对包含列表(或元组)的列表的第二个元素进行排序:
from operator import itemgetter
mylist = [[1, 2], [2, 2], [3, 5], [4, 1], [5, 2]]
sortedlist = sorted(mylist, key=itemgetter(1))
答案 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]]
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。