如果值为sam,则合并字典键

2024-05-19 09:47:46 发布

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

所以这是一个奇怪的问题,我怀疑很容易解决。我正在为我家里的远程玩家建立一个歌词网络应用程序。它目前会生成一个包含玩家所演奏歌曲的字典。例如:

{
    'bathroom': <Song: Blur - Song 2>,
    'bedroom1': <Song: Blur - Song 2>,
    'kitchen': <Song: Meat Loaf - I'd Do Anything for Love (But I Won't Do That)>,
}

偶尔会同步这些播放器的子集。所以-如上所述-它们显示相同的值。我想在界面中对这些进行分组。在构建字典时,我可能会更聪明,但如果我不这样做,有没有按值合并键的好方法?你知道吗

上面的期望输出是:

{
    'bathroom,bedroom1': <Song: Blur - Song 2>,
    'kitchen': <Song: Meat Loaf - I'd Do Anything for Love (But I Won't Do That)>,
}

然而,这确实打破了我想查找东西的方式(我想通过名称来指定,因此这是一个字典)。。。是否有更好的集合可以为每个值提供多个键,并指示何时存在合并的重复项(并向后引用其所有键)?你知道吗


有一个很好的答案,它可以将此转换为一组歌曲,并将播放器列表作为一个值。这是伟大的,除了有时我想知道哪首歌是在一个命名的播放器播放。这就是我最初带字典的原因。你知道吗

有没有一种好的方法可以在两个方向上保留查找(除了保留两个集合之外)?你知道吗


Tags: for字典song玩家播放器歌曲doanything
0条回答
网友
1楼 · 发布于 2024-05-19 09:47:46

当涉及的数据量很大时,这就是关系数据库的用武之地。一个数据库有两列,key和value,key列上有一个索引,它的行为有点像dict,但是您也可以在value列上放置一个索引,以实现高效的反向查找。你知道吗

不过,在您的例子中,由于涉及的数据量很小,所以我只需要做一个defaultdict,然后添加(value, key)对。你知道吗

reverse_lookup = defaultdict(list)
for k, v in now_playing.items():
    reverse_lookup[v].append(k)

然后可以','.join()这些值来生成复合键。由于这些复合键将用于显示,似乎并不真正用于查找,我只是将原始dict和反向查找dict都保留在内存中,并在执行查找时使用所需的任意一个。找到与给定歌曲播放相同歌曲的其他播放器(可能是同步的)的任务需要两个查找,一个向前查找,一个向后查找,但它们是哈希表查找,因此增加的成本最小。你知道吗


在考虑了其他更“有趣”的方法之后:你也许可以通过改变disjoint set data structure来满足你的需求。每个播放器都有一个节点,当前播放的每首歌都有一个节点。节点按歌曲分组,其中一组包含歌曲的节点和当前播放该歌曲的任何播放器的节点。如果将每个集合的节点(歌曲和播放器)放在循环链表中,只要正确维护了整个数据结构,就可以从任何节点开始遍历列表,在歌曲和播放该歌曲的播放器列表上进行迭代。你知道吗

当然,诀窍在于找到一种有效的方法来维护整个数据结构,即随着歌曲的变化而更新循环列表。如果球员是真正的同步,这就像更换一个歌曲节点与另一个容易,每次整个组球员移动到下一个轨道。但是我可以想象一个像你正在构建的应用程序经常需要做其他类型的查找,不相交的集合结构对你没有任何好处。你知道吗

网友
2楼 · 发布于 2024-05-19 09:47:46
from itertools import groupby

x = {
    'bathroom': 'a',
    'bedroom1': 'a',
    'kitchen': 'b'
}


{
  ','.join(i[0] for i in v): k
  for k,v in groupby(sorted(x.iteritems(), key=lambda p: p[1]), lambda p: p[1])
}

相关问题 更多 >

    热门问题