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。我不知道如何说谢谢你。