如何从python中的嵌套列表中创建成对元素计数的[排序]表?

2024-04-28 16:39:03 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图实现一个涉及耦合元素计数和排序的过程。然而,我被卡住了

以下是一个例子:

olimpic=[['Russia', 'bronze', 'basketball_male'],
 ['China', 'gold', 'soccer_female'],
 ['China', 'silver', 'judo_male_100kg'],
 ['Australia', 'gold', 'surf_male'],
 ['Cuba', 'gold', 'gymnastics_solo_female'],
 ['Russia', 'silver', 'karate_female_60kg'],
 ['China', 'silver', 'voleyball_female']]

这是我已经做过的:

short=[]

for i in range(len(olimpic)):
    short.append([olimpic[i][0],olimpic[i][1]])
    
countrySort=sorted(short, key=lambda element: (element, element[1]))

print (countrySort)

我当前的输出是:

[['Australia', 'gold'],
 ['China', 'gold'],
 ['China', 'silver'],
 ['China', 'silver'],
 ['Cuba', 'gold'],
 ['Russia', 'bronze'],
 ['Russia', 'silver']]

但是,我必须执行其他三个步骤:

  1. 对国家和奖牌类型进行配对计数

  2. 根据奖牌类型的数量进行分类,记住:;黄金>;银牌>;无论奖牌数量多少,铜牌都在较低级别

  3. 当两个或两个以上的国家拥有完全相同数量的奖牌时,按其名称进行排序

输出应如下所示(元组列表):

Rank of the countries:
    
(1, 2, 0, 'China')
(1, 0, 0, 'Australia')
(1, 0, 0, 'Cuba')
(0, 1, 1, 'Russia')

Tags: 数量silver排序elementmalefemale计数short
3条回答

首先,我们创建以下词典:

{'Russia': [0, -1, -1, 'Russia'], 'China': [-1, -2, 0, 'China'], 'Australia': [-1, 0, 0, 'Australia'], 'Cuba': [-1, 0, 0, 'Cuba']}

将值插入数组:

[[0, -1, -1, 'Russia'], [-1, -2, 0, 'China'], [-1, 0, 0, 'Australia'], [-1, 0, 0, 'Cuba']]

对数组进行排序

[[-1, -2, 0, 'China'], [-1, 0, 0, 'Australia'], [-1, 0, 0, 'Cuba'], [0, -1, -1, 'Russia']]

然后我们将奖牌计数从负反转为正,并将子数组转换为元组

[(1, 2, 0, 'China'), (1, 0, 0, 'Australia'), (1, 0, 0, 'Cuba'), (0, 1, 1, 'Russia')]

我们将初始奖牌数量存储为负数,因为我们希望按降序排列奖牌数量,但字符串按升序排列。这将允许我们简单地调用.sort()方法,根据需要对数组进行排序。然后,我们可以将奖牌数量转换回最终输出的正值

olimpic=[['Russia', 'bronze', 'basketball_male'],
    ['China', 'gold', 'soccer_female'],
    ['China', 'silver', 'judo_male_100kg'],
    ['Australia', 'gold', 'surf_male'],
    ['Cuba', 'gold', 'gymnastics_solo_female'],
    ['Russia', 'silver', 'karate_female_60kg'],
    ['China', 'silver', 'voleyball_female']]

short=[]

for i in range(len(olimpic)):
    short.append([olimpic[i][0],olimpic[i][1]])

country_to_medal_counts_map = {}
medal_to_indice_map = {'gold': 0, 'silver': 1, 'bronze': 2}

for country, medal in short:
    if country not in country_to_medal_counts_map:
        country_to_medal_counts_map[country] = [0,0,0,country]
    country_to_medal_counts_map[country][medal_to_indice_map[medal]] -= 1

country_rankings = [medal_counts for medal_counts in country_to_medal_counts_map.values()]
country_rankings.sort()
country_rankings = [tuple([gold*-1, silver*-1, bronze*-1, country]) 

for gold, silver, bronze, country in country_rankings]
        
        
print (country_rankings)
# [(1, 2, 0, 'China'), (1, 0, 0, 'Australia'), (1, 0, 0, 'Cuba'), (0, 1, 1, 'Russia')]
olympic=[['Russia', 'bronze', 'basketball_male'],
 ['China', 'gold', 'soccer_female'],
 ['China', 'silver', 'judo_male_100kg'],
 ['Australia', 'gold', 'surf_male'],
 ['Cuba', 'gold', 'gymnastics_solo_female'],
 ['Russia', 'silver', 'karate_female_60kg'],
 ['China', 'silver', 'voleyball_female']]

short=[]
for i in range(len(olympic)):
    short.append([olympic[i][0],olympic[i][1]])

medal_dict = {'bronze':2,'silver':1,'gold':0}

ret={}
for x in short:
  if x[0] not in ret.keys():
   ret.update({x[0]:(0,0,0)})
  temp = [y for y in ret[x[0]]]
  temp[medal_dict[x[1]]] += 1
  ret[x[0]]=tuple([y for y in temp])

print(sorted(ret.items(),key = lambda x:x[1][1]))

## [('Australia', (1, 0, 0)), ('Cuba', (1, 0, 0)), ('Russia', (0, 1, 1)), ('China', (1, 2, 0))]
from collections import defaultdict

olimpic=[
 ['Russia', 'bronze', 'basketball_male'],
 ['China', 'gold', 'soccer_female'],
 ['China', 'silver', 'judo_male_100kg'],
 ['Australia', 'gold', 'surf_male'],
 ['Cuba', 'gold', 'gymnastics_solo_female'],
 ['Russia', 'silver', 'karate_female_60kg'],
 ['China', 'silver', 'voleyball_female'],
 ['Canada', 'silver', 'voleyball_female'],
 ['Canada', 'silver', 'voleyball_female'],
 ['Canada', 'gold', 'voleyball_female']]


d = defaultdict(lambda: defaultdict(int))

for x, y, z in olimpic:
    d[x].setdefault('gold', 0)
    d[x].setdefault('silver', 0)
    d[x].setdefault('bronze', 0)
    d[x][y] += 1

class C:
    def __init__(self, key):
        self.key = key
        self.values = tuple(d[key].values())

    def __lt__(self, other):
        if self.values == other.values:
            if self.key < other.key:
                return True
        else:
            if self.values > other.values:
                return True

l = []

for i in sorted(d, key=C):
    l.append(tuple((*d[i].values(), i)))

print(f'Rank of the Countries\n{chr(10).join([str(i) for i in l])}')
Rank of the Countries
(1, 2, 0, 'Canada')
(1, 2, 0, 'China')
(1, 0, 0, 'Australia')
(1, 0, 0, 'Cuba')
(0, 1, 1, 'Russia')

相关问题 更多 >