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