我希望在字典的值完全相同时删除字典的键。简而言之,我试图删除任何只有一个物种的群集。 我的数据如下:
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)
答案 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