Python 基于列表中列表中的公共元素提取最大列表
我想知道是否有可能根据列表中的一个公共元素提取最大列表。 我的意思是,假设我们有以下列表:Python 基于列表中列表中的公共元素提取最大列表,python,list,Python,List,我想知道是否有可能根据列表中的一个公共元素提取最大列表。 我的意思是,假设我们有以下列表: list = [['p_1', [3, 4, 5, 6], 6.2], ['p_2', [3, 4, 5, 6], 8.4], ['p_3', [3, 7, 8, 9],9.1], ['p_4', [3, 4, 5, 6],8.2]] 我的计划是将每个列表中的第二个元素与其他列表中的第二个元素进行比较,然后如果第二个元素相同,则选择第三个元素最高的列表。例
list = [['p_1', [3, 4, 5, 6], 6.2],
['p_2', [3, 4, 5, 6], 8.4],
['p_3', [3, 7, 8, 9],9.1],
['p_4', [3, 4, 5, 6],8.2]]
我的计划是将每个列表中的第二个元素与其他列表中的第二个元素进行比较,然后如果第二个元素相同,则选择第三个元素最高的列表。例如,第一、第二和第四个列表的第二个元素是相同的(即[3,4,5,6]
)。现在,由于6.2<8.2<8.4
将选择第二个列表。此外,由于第三个列表的第二个元素是唯一的,因此也应选择该列表。事实上,最终列表应该如下所示:
max_list = [['p_2', [3, 4, 5, 6], 8.4], ['p_3', [3, 7, 8, 9],9.1]]
我使用了以下代码来修改当前列表,但它不起作用
import itertools
for i, k in itertools.combinations(list, 2):
if i[1]==k[1]:
if i[3]>= k[3]:
list.remove(k)
else:
list.remove(i)
感谢您的帮助您可以按第二个元素排序,然后使用
itertools.groupby()
将具有相同第二个元素的元素分组。这将为您提供所有第二个元素都相同的组。之后,可以基于第三个元素使用max()
:
from itertools import groupby
from operator import itemgetter
second = itemgetter(1)
third = itemgetter(2)
max_list = [max(g, key=third) for k, g in groupby(sorted(l, key=second), key=second)]
# [['p_2', [3, 4, 5, 6], 8.4], ['p_3', [3, 7, 8, 9], 9.1]]
您可以按第二个元素排序,然后使用
itertools.groupby()
将具有相同第二个元素的元素分组。这将为您提供所有第二个元素都相同的组。之后,可以基于第三个元素使用max()
:
from itertools import groupby
from operator import itemgetter
second = itemgetter(1)
third = itemgetter(2)
max_list = [max(g, key=third) for k, g in groupby(sorted(l, key=second), key=second)]
# [['p_2', [3, 4, 5, 6], 8.4], ['p_3', [3, 7, 8, 9], 9.1]]
你的逻辑是正确的,你几乎找到了解决办法。以下是你的错误:
['p_1',[3,4,5,6],6.2]
)包含三项。因此,最后一项的索引是2
,而不是您在代码中编写的3
。如果i[2]>=k[2]:你应该写,而不是如果i[3]>=k[3]:
ValueError
import itertools
list = [['p_1', [3, 4, 5, 6], 6.2],
['p_2', [3, 4, 5, 6], 8.4],
['p_3', [3, 7, 8, 9],9.1],
['p_4', [3, 4, 5, 6],8.2]]
max_list = list[:] # it is better to use a copy of the original list
for i, k in itertools.combinations(max_list, 2):
if i[1] == k[1]:
if i[2] >= k[2] and k in max_list:
max_list.remove(k)
elif i[2] < k[2] and i in max_list:
max_list.remove(i)
print(max_list) # [['p_2', [3, 4, 5, 6], 8.4], ['p_3', [3, 7, 8, 9], 9.1]]
更新:计数的新版本
假设您有上面的列表。它包含12个项目。运行计算max\u列表
(即第一个代码)的alogithms后,您将拥有包含11项的列表max\u列表
,因为其中一项已被删除(重复)
为此,以下是计数算法:
counting = {}
points = set([item[0] for item in max_list if item[0]])
for point in points:
counting[point] = len([1 for item in max_list if item[0]==point])
print(counting) # {'point_21': 6, 'point_20': 5}
你的逻辑是正确的,你几乎找到了解决办法。以下是你的错误:
内部列表(例如,['p_1',[3,4,5,6],6.2]
)包含三项。因此,最后一项的索引是2
,而不是您在代码中编写的3
。如果i[2]>=k[2]:
你应该写,而不是如果i[3]>=k[3]:
ValueError
import itertools
list = [['p_1', [3, 4, 5, 6], 6.2],
['p_2', [3, 4, 5, 6], 8.4],
['p_3', [3, 7, 8, 9],9.1],
['p_4', [3, 4, 5, 6],8.2]]
max_list = list[:] # it is better to use a copy of the original list
for i, k in itertools.combinations(max_list, 2):
if i[1] == k[1]:
if i[2] >= k[2] and k in max_list:
max_list.remove(k)
elif i[2] < k[2] and i in max_list:
max_list.remove(i)
print(max_list) # [['p_2', [3, 4, 5, 6], 8.4], ['p_3', [3, 7, 8, 9], 9.1]]
更新:计数的新版本
假设您有上面的列表。它包含12个项目。运行计算max\u列表
(即第一个代码)的alogithms后,您将拥有包含11项的列表max\u列表
,因为其中一项已被删除(重复)
为此,以下是计数算法:
counting = {}
points = set([item[0] for item in max_list if item[0]])
for point in points:
counting[point] = len([1 for item in max_list if item[0]==point])
print(counting) # {'point_21': 6, 'point_20': 5}
非常感谢你,马克。简单地问一下,因为count()不适用于列表列表,我如何找出每个点(即“p_1”、“p_2”和…)具有最大值的次数?我的意思是某个东西告诉我:'p_2'=1'p_3'=1…我更新了我的代码。您可以在我的代码中查看如何实现此目标。非常感谢Mark。简单地问一下,因为count()不适用于列表列表,我如何找出每个点(即“p_1”、“p_2”和…)具有最大值的次数?我的意思是某个东西告诉我:'p_2'=1'p_3'=1…我更新了我的代码。您可以在我的代码中查看如何实现此目标。谢谢Codrephi。我不知道为什么,但它并没有显示最大值列表中的全部点。在我的列表主列表中,有一点是重复的4046,但是当我运行你的代码时,它根本没有显示出来。对于所有其他点,计数为1,这是不正确的。计数部分是先前代码的扩展(max\u list
)。你现在遇到的问题很难理解,因为我没有你的原始数据。也许,你应该用更多的细节更新你的代码,或者创建另一个帖子/线程。我知道我该如何解决第一个问题,现在唯一的问题是所有分数的计数=1。我不知道如何说“谢谢你”足够多了。谢谢你。我不知道为什么,但它并没有显示最大值列表中的全部点。在我的列表主列表中,有一点是重复的4046,但是当我运行你的代码时,它根本没有显示出来。对于所有其他点,计数为1,这是不正确的。计数部分是先前代码的扩展(max\u list
)。你现在遇到的问题很难理解,因为我没有你的原始数据。也许,你应该用更多的细节更新你的代码,或者创建另一个帖子/线程。我知道我该如何解决第一个问题,现在唯一的问题是所有分数的计数=1。我不知道如何说谢谢你。