我有一个列表列表,我正在尝试从第一个列表列表中的特定项目中创建另一个列表列表
listOne = [[1,1,9,9],[1,4,9,6],[2,1,12,12]]
listTwo = []
对于位置0
和2
中具有相同数字的每个内部列表,附加到listTwo只有位置3
中具有最大值的内部列表
例如,inner list 0
和inner list 1
1
中的position 0
和9
中的position 2
都有inner list 0
,9
} position 3
中有一个inner list 1
而6
中position 3
有一个inner list 1
,所以我想追加inner list 9
而不是listTwo
到inner list 2
。由于2
是position 0
中12
和position 1
中for items in listOne :
#for all items where items[0] and items[2] are equal :
#tempList = []
#tempList.append(items)
#tempList.sort(key = lambda x: (x[3]))
#for value in tempList[0] :
#listTwo.append(all lists with value in tempList[0])
的唯一列表,因此无需将其与其他任何内容进行比较,并且可以追加to listTwo。
我想的是:
cv2.error: /home/desktop/OpenCV/opencv/modules/core/src/matrix.cpp:2294:
error: (-215) d == 2 && (sizes[0] == 1 || sizes[1] == 1 ||
sizes[0]*sizes[1] == 0) in function create
但是我不知道如何在没有很多非常糟糕的代码的情况下实现这一点,对于#pythonic"排序这些清单的方法?
答案 0 :(得分:1)
也许把所有东西扔进字典?像这样:
def strangeFilter(listOne):
listTwo = []
d = {}
for innerList in listOne:
positions = (innerList[0],innerList[2])
if positions not in d:
d[positions] = []
d[positions].append(innerList)
for positions in d:
listTwo.append(max(d[positions], key= lambda x: x[3]))
return listTwo
不确定有多少' pythonic'这是解决方案,但它使用python定义的结构,并且具有O(n)
的良好时间顺序答案 1 :(得分:1)
如果你想编写简洁的python,你将尽可能使用list comprehensions。你的描述有点令人困惑,但有点像
list_two = [inner_list for inner_list in list_one if inner_list[0] == inner_list[2]]
将为您提供0
和2
索引匹配的所有内部列表。然后你可以搜索所有这些以找到具有最大3
索引的那个,假设没有任何关系
list_three = [0,0,0,0]
for i in list_two:
if i[3] > list_three[3]:
list_three = i
答案 2 :(得分:1)
对项目零和两个内部列表上的列表进行排序。使用itertools.groupby
提取每个组中位置 3处具有最大值的项目。
import operator, itertools
# a couple of useful callables for the key functions
zero_two = operator.itemgetter(0,2)
three = operator.itemgetter(3)
a = [[2,1,12,22],[1,1,9,9],[2,1,12,10],
[1,4,9,6],[8,8,8,1],[2,1,12,12],
[1,3,9,8],[2,1,12,15],[8,8,8,0]
]
a.sort(key = zero_two)
for key, group in itertools.groupby(a, zero_two):
print(key, max(group, key = three))
'''
>>>
(1, 9) [1, 1, 9, 9]
(2, 12) [2, 1, 12, 22]
(8, 8) [8, 8, 8, 1]
>>>
'''
result = [max(group, key = three) for key, group in itertools.groupby(a, zero_two)]
您还可以对零,二,三项进行排序。然后按项目零和二分组,并提取该组的最后一项。
zero_two_three = operator.itemgetter(0,2,3)
zero_two = operator.itemgetter(0,2)
last_item = operator.itemgetter(-1)
a.sort(key = zero_two_three)
for key, group in itertools.groupby(a, zero_two):
print(key, last_item(list(group)))