2016-03-06 85 views
1

我有2列的文件:的Python:字典,收集

Anzegem    Anzegem 
Gijzelbrechtegem Anzegem 
Ingooigem   Anzegem 
Aalst    Sint-Truiden 
Aalter    Aalter 

的第一列是一个小镇,第二列是城镇的区。

我犯了这样的该文件的字典:

def readTowns(text): 
    input = open(text, 'r') 
    file = input.readlines() 
    dict = {} 
    verzameling = set() 
    for line in file: 
     tmp = line.split() 
     dict[tmp[0]] = tmp[1] 
    return dict 

如果我设置一个变量'writeTowns' equal to readTowns(text)writeTown['Anzegem'],我希望得到一个collection of {'Anzegem', 'Gijzelbrechtegem', 'Ingooigem'}

有谁知道如何做到这一点?

+0

的可能的复制。 HTTP://计算器。com/questions/7657457/find-key-from-value-in-python-dictionary –

+0

对于给定的键,只能有一个值,但该值*可以是一个集合... – jonrsharpe

+0

为什么“Aalst”和'Aalter'不包括在内?当你说“集合”时,你的意思是“[set](https://docs.python.org/3/library/stdtypes.html#set)”? – Chris

回答

1

我想你可以创建另一个函数来创建适合你需要的数据结构。因为在最后,您最终将编写基本上操纵由readTowns返回的字典的代码,以根据您的要求生成数据。为什么不保持代码清洁并为此创建另一个功能。您只需创建一个名称来列出字典,并且您已全部设置。

def writeTowns(text): 
    input = open(text, 'r') 
    file = input.readlines() 
    dict = {} 
    for line in file: 
     tmp = line.split() 
     dict[tmp[1]] = dict.get(tmp[1]) or [] 
     dict.get(tmp[1]).append(tmp[0]) 
    return dict 


writeTown = writeTowns('file.txt') 
print writeTown['Anzegem'] 

如果您担心读同一个文件,你可以做这样的事情还有,

def readTowns(text): 
    input = open(text, 'r') 
    file = input.readlines() 
    dict2town = {} 
    town2dict = {} 
    for line in file: 
     tmp = line.split() 
     dict2town[tmp[0]] = tmp[1] 
     town2dict[tmp[1]] = town2dict.get(tmp[1]) or [] 
     town2dict.get(tmp[1]).append(tmp[0]) 
    return dict2town, town2dict 

dict2town, town2dict = readTowns('file.txt') 
print town2dict['Anzegem'] 
1

如果你建立你的字典为{town: district},所以镇是关键,区是价值,你不能轻易做到这一点*,因为字典并不意味着以这种方式使用。字典允许您轻松找到与给定键相关的值。所以,如果你想找到一个地区的所有城镇,你建立你的词典中的更好:

{district: [list_of_towns]}

因此,例如区安泽海姆将显示为{'Anzegem': ['Anzegem', 'Gijzelbrechtegem', 'Ingooigem']}

当然的价值是你的收藏。

*您可以通过遍历整个字典并检查匹配发生的位置来做到这一点,但这不是非常有效。

1

你可以做这样的事情,不过,请看看@ ubadub的答案,有更好的方法来组织你的数据。

[town for town, region in dic.items() if region == 'Anzegem'] 
1

这听起来像你想的字典,其中键是各区这些值是城镇列表。 做到这一点的一个基本方式是:

def readTowns(text): 
    with open(text, 'r') as f: 
     file = input.readlines() 
     my_dict = {} 
     for line in file: 
      tmp = line.split() 
      if tmp[1] in dict: 
       my_dict[tmp[1]].append(tmp[0]) 
      else: 
       my_dict[tmp[1]] = [tmp[0]] 
    return dict 

的if/else语句块也可以使用Python的defaultdict子类(docs这里)来实现,但是我在这里使用了if/else语句的可读性。

也有一些其他的要点:变量dictfile是蟒蛇类型,因此它是不好的做法,用自己的局部变量来覆盖这些(请注意我在上面的代码改变dictmy_dict