第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問題,去搜搜看,總會(huì)有你想問的

字典集的所有組合成 K 個(gè) N 大小的組

字典集的所有組合成 K 個(gè) N 大小的組

阿晨1998 2021-09-25 14:42:38
我雖然這很簡單,但不幸的是,事實(shí)并非如此。我正在嘗試構(gòu)建一個(gè)函數(shù)來獲取可迭代的字典(即唯一字典列表)并返回字典唯一分組列表的列表。如果我有x球員,我想組建規(guī)模k較大的團(tuán)隊(duì)n。這個(gè)問題和來自 CMSDK 的一組答案是我能找到的最接近解決方案的東西。在從處理字母字符串到字典的過程中,我發(fā)現(xiàn)我的 Python 技能不足。我正在改編的原始函數(shù)來自第二個(gè)答案:import itertools as itdef unique_group(iterable, k, n):    """Return an iterator, comprising groups of size `k` with combinations of size `n`."""    # Build separate combinations of `n` characters    groups = ("".join(i) for i in it.combinations(iterable, n))    # 'AB', 'AC', 'AD', ...    # Build unique groups of `k` by keeping the longest sets of characters    return (i for i in it.product(groups, repeat=k)                 if len(set("".join(i))) == sum((map(len, i))))     # ('AB', 'CD'), ('AB', 'CE'), ... 我目前的改編(TypeError: object of type 'generator' has no len()由于調(diào)用,完全失敗并出現(xiàn)錯(cuò)誤map(len, i)):def unique_group(iterable, k, n):    groups = []    groups.append((i for i in it.combinations(iterable, n)))    return ( i for i in it.product(groups, repeat=k) if len(set(i)) == sum((map(len, i))) )對(duì)于一些上下文:我試圖根據(jù)他們的技能以編程方式將一組玩家劃分為圣誕節(jié)瑣事的團(tuán)隊(duì)。字典列表由一個(gè) yaml 文件組成,看起來像- name: Patricia  skill: 4- name: Christopher  skill: 6- name: Nicholas  skill: 7- name: Bianca  skill: 4其中,在yaml.load生成字典列表之后:players = [{'name':'Patricia', 'skill':4},{'name':'Christopher','skill':6},           {'name':'Nicholas','skill':7},{'name':'Bianca','skill':4}]所以我希望輸出看起來像這些( wherek = 2和n = 2)的列表:(    # Team assignment grouping 1    (        # Team 1        ( {'name': 'Patricia', 'skill': 4}, {'name': 'Christopher', 'skill': 6} ),        # Team 2        ( {'name': 'Nicholas', 'skill': 7}, {'name': 'Bianca', 'skill': 4} )    ),)每個(gè)團(tuán)隊(duì)分配分組需要在團(tuán)隊(duì)中具有唯一的球員(即,團(tuán)隊(duì)分配分組中的多個(gè)團(tuán)隊(duì)中不能有相同的球員),并且每個(gè)團(tuán)隊(duì)分配分組都需要是唯一的。一旦我有了團(tuán)隊(duì)分配組合列表,我將總結(jié)每個(gè)組的技能,取最高技能和最低技能之間的差異,并選擇最高技能和最低技能之間差異最小的分組(有方差)。我承認(rèn)我不完全理解這段代碼。我理解第一個(gè)任務(wù)是創(chuàng)建一個(gè)字符串中所有字母組合的列表,以及在產(chǎn)品不包含不同組中相同字母的情況下查找產(chǎn)品的返回語句。我最初的嘗試是簡單地采用 ,it.product(it.combinations(iterable, n), repeat=k)但這并不能實(shí)現(xiàn)跨組的唯一性(即,我在一個(gè)分組的不同團(tuán)隊(duì)中獲得相同的球員)。
查看完整描述

6 回答

?
慕桂英4014372

TA貢獻(xiàn)1871條經(jīng)驗(yàn) 獲得超13個(gè)贊

這是我利用集合的新數(shù)據(jù)類的地方。您可以通過frozen=True在裝飾器中設(shè)置來使數(shù)據(jù)類可散列。首先,您要將玩家添加到一個(gè)集合中以獲得獨(dú)特的玩家。然后你會(huì)得到 n 大小球隊(duì)的所有球員組合。然后你可以創(chuàng)建一組獨(dú)特的團(tuán)隊(duì)。然后創(chuàng)建有效的分組,而沒有球員在團(tuán)隊(duì)中出現(xiàn)多次。最后,您可以計(jì)算整個(gè)分組的總團(tuán)隊(duì)技能水平的最大差異(再次利用組合),并使用它來對(duì)您的有效分組進(jìn)行排序。所以像這樣的事情。


from dataclasses import dataclass

from itertools import combinations

from typing import FrozenSet


import yaml



@dataclass(order=True, frozen=True)

class Player:

    name: str

    skill: int



@dataclass(order=True, frozen=True)

class Team:

    members: FrozenSet[Player]


    def total_skill(self):

        return sum(p.skill for p in self.members)



def is_valid(grouping):

    players = set()

    for team in grouping:

        for player in team.members:

            if player in players:

                return False

            players.add(player)

    return True



def max_team_disparity(grouping):

    return max(

        abs(t1.total_skill() - t2.total_skill())

        for t1, t2 in combinations(grouping, 2)

    )



def best_team_matchups(player_file, k, n):

    with open(player_file) as f:

        players = set(Player(p['name'], p['skill']) for p in yaml.load(f))

    player_combs = combinations(players, n)

    unique_teams = set(Team(frozenset(team)) for team in player_combs)

    valid_groupings = set(g for g in combinations(unique_teams, k) if is_valid(g))

    for g in sorted(valid_groupings, key=max_team_disparity):

        print(g)



best_team_matchups('test.yaml', k=2, n=4)

示例輸出:


(

    Team(members=frozenset({

        Player(name='Chr', skill=6),

        Player(name='Christopher', skill=6),

        Player(name='Nicholas', skill=7),

        Player(name='Patricia', skill=4)

    })),

    Team(members=frozenset({

        Player(name='Bia', skill=4),

        Player(name='Bianca', skill=4),

        Player(name='Danny', skill=8),

        Player(name='Nicho', skill=7)

    }))

)


查看完整回答
反對(duì) 回復(fù) 2021-09-25
  • 6 回答
  • 0 關(guān)注
  • 252 瀏覽
慕課專欄
更多

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)