2014-02-10 65 views
0

我正在寻找删除字典的键时,它的值都是相同的。简而言之,我试图去除只有一个物种的任何群集。 我的数据看起来像这样:当多个值相同时删除字典密钥

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

数目对应于群集名称,和所述第二柱,其属于它的种类的名称。 在这个例子中,我想删除集群11556(它只有一个物种)。 我用了一本字典,但我不确定如何删除只有一个值的键。并追踪它们!

任何建议?

EDIT附加代码:

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) 
+2

文件能否请你展示你试过的代码? – thefourtheye

+0

如果您为每个键维护单个值,那么键'11554','11555'和'11556'具有相同的值'rugi',您想要删除与您之前键中已有的值相同的所有键。对? –

+1

“当它的关键字完全相同时” - 你可能会误解词典的工作原理。一个字典将每个键映射到** a **值 - 一个键不能出现两次,或者'd [that_key]'返回什么? – user2357112

回答

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

+0

这是很好的,似乎做的伎俩,快速的问题我如何写字典到文本文件,我试过f.write(集群),但不工作! – user3188922

+0

请检查更新的答案 – Sar009

+0

非常感谢,这太棒了! – user3188922

0

在下面的代码由uniq_cluster作为uniq的值和repeated_cluster consit所有重复簇

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

+0

非常感谢!是的,我并不是指重复的键,而是重复的键内的值 – user3188922

相关问题