【问题标题】:Python: dictionary to collectionPython:字典到集合
【发布时间】:2016-03-06 21:14:44
【问题描述】:

我有一个包含 2 列的文件:

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'}

有人知道怎么做吗?

【问题讨论】:

  • 给定键只能有一个值,但该值可以是一个集合...
  • 为什么不包括AalstAalter?当您说“收藏”时,您的意思是“set”吗?
  • 你还没有理解字典的概念。 writeTown['Anzegem']返回与 key 'Anzegem' 关联的 values。您正在寻找与 value 'Anzegem' 关联的 keys

标签: python


【解决方案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']

【讨论】:

    【解决方案2】:

    您可以这样做,不过,请查看@ubadub 的回答,有更好的方法来组织您的数据。

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

    【讨论】:

      【解决方案3】:

      听起来您想制作一个字典,其中键是地区,值是城镇列表。 一个基本的方法是:

      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 是python 类型,所以用你自己的局部变量覆盖它们是不好的做法(注意我在上面的代码中将dict 更改为my_dict .

      【讨论】:

        【解决方案4】:

        如果您将字典构建为{town: district},那么城镇是键,地区是值,您不能轻易做到这一点*,因为字典不应该以这种方式使用。字典允许您轻松找到与给定键关联的值。因此,如果您想查找一个地区的所有城镇,最好将您的字典构建为:

        {district: [list_of_towns]}

        例如,Anzegem 区将显示为{'Anzegem': ['Anzegem', 'Gijzelbrechtegem', 'Ingooigem']}

        当然,价值在于您的收藏。

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2012-04-27
          • 2022-01-22
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2010-12-27
          • 2013-03-07
          • 1970-01-01
          相关资源
          最近更新 更多