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

时间:2014-02-10 07:18:15

标签: 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)

3 个答案:

答案 0 :(得分:4)

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

但您可以从密钥dict获得list个值。

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),您就不会有重复的值。

答案 1 :(得分:1)

你不能在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

的文件中打印输出

答案 2 :(得分:0)

在下面的代码中,uniq集群作为唯一值,重复集群包含所有重复集群

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