当多个值相同时,删除字典键

  • 本文关键字:删除 字典 python dictionary
  • 更新时间 :
  • 英文 :


我希望在字典的值都相同时删除字典的键。简而言之,我正在尝试删除任何只有一个物种的集群。我的数据如下所示:

11554   sulc
11554   rubr
11554   rugi
11554   turc
11555   rubr
11555   rugi
11555   sulc
11555   turc
11556   rugi
11556   rugi
11556   rugi

数字对应于集群名称,第二列对应于属于它的物种的名称。在这个例子中,我想删除集群 11556(只有一个物种)。我使用了字典,但我不确定如何仅删除只有一个值的键。并且还要跟踪它们!

有什么建议吗?

编辑添加代码:

cluster = {}
my_file = open('out.txt')
for line in my_file:
       columns = line.strip().split('t')
       name = columns[0]
       species = columns[1]
       cluster[name] = species
def remove_duplicates(d):
       encountered_entries = set()
       for key, entry in cluster.items():
            if (in encountered_entries:
                 del d[key]
            else:
                 encountered_entries.add(key, entry)

首先,Python dict不能有重复的键。

但是你可以有一个从键到list值的dict

from collections import defaultdict
clusters = defaultdict(list)
with open('out.txt') as my_file:
    for line in my_file:
        clusters[name].append(species)

然后你可以这样做:

clusters = {name:species for name, species in clusters.iteritems() if len(set(species)) > 1}
print clusters

顺便说一句,你想保留重复的物种名称吗?如果没有,您可以将defaultdict(list)更改为defaultdict(set)len(set(species))更改为len(species),您将不会有重复的值。

在 Python 字典中不能有重复的键,如果一个键出现多次,您可以使用值列表

clusters = {}
my_file = open('out.txt', 'r')
for line in my_file:
    columns = line.strip().split('t')
    name = columns[0]
    species = columns[1]
    if clusters.get(name) is not None:
        if species not in clusters[name]:
            clusters[name].append(species)
    else:
        clusters[name]=[species]
my_file.close()
my_output_file = open('in.txt', 'w')
for each_cluster_key in clusters.keys():
    if len(clusters[each_cluster_key]) < 2:
        clusters.pop(each_cluster_key, None)
    else:
        for each_species in clusters[each_cluster_key]:
            my_output_file.write(each_cluster_key+'t'+each_species+'n')
my_output_file.close()
print clusters

程序将在名为 in.txt 的文件中打印输出

在下面的代码中,uniq_cluster 组成 uniq 值,repeated_cluster组成所有重复的集群

uniq_cluster =set()
if data['key'] in uniq_cluster:
      repeated_cluster.add(data['key']
      continue
else:
     uniq_cluster.add(data['key']
print uniq_cluster
print repeated_cluster

最新更新