如何修复相同键具有不同值的字典错误

2024-06-30 07:53:26 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个文本文件,其中的行有两列(由制表符分隔)。我想打开这个文件并输出一个字典,将第一列存储为键,然后将第二列存储为值。但我很难处理具有不同值的键(如下面的Camiguin):

Sandingan   Loon, Bohol
Pangangan   Calape, Bohol
Limasawa    Limasawa, Southern Leyte
Catalat San Vicente, Palawan
Camiguin    Catarman, Camiguin
Camiguin    Guinsiliban, Camiguin
Camiguin    Mahinog, Camiguin
Camiguin    Mambajao, Camiguin
Camiguin    Sagay, Camiguin
Rasa    Narra, Palawan

我使用的代码是:

filesDir = "C:\Users\user\Desktop"

fhand = open(filesDir+"\input.txt")
fout = open(filesDir+"output.txt","w")

d = dict()

for line in fhand:
  x = line.rstrip("\n")
  x = x.split("\t")

  if x[0] not in d:
    d[x[0]] = x[1]

  else:
    d[x[0]] += x[1]
    continue

print(d)

我得到的结果是这样的(注意Camiguin的结果,它只是将这些值串联在一起。我可能需要使用一个列表,但我不知道如何:

{'Limasawa': 'Limasawa, Southern Leyte', 'Rasa': 'Narra, Palawan', 'Catalat': 'San Vicente, Palawan', 'Camiguin': 'Catarman, CamiguinGuinsiliban, CamiguinMahinog, CamiguinMambajao, CamiguinSagay, Camiguin', 'Pangangan': 'Calape, Bohol', 'Sandingan': 'Loon, Bohol'}

编辑:我想要的输出应该是这样的:

{'Limasawa': 'Limasawa, Southern Leyte', 'Rasa': 'Narra, Palawan', 'Catalat': 'San Vicente, Palawan', 'Camiguin': ['Catarman, Camiguin','Guinsiliban, Camiguin','Mahinog, Camiguin','Mambajao, Camiguin','Sagay, Camiguin'], 'Pangangan': 'Calape, Bohol', 'Sandingan': 'Loon, Bohol'}

Tags: sanrasasouthernlooncamiguincatalatleytelimasawa
3条回答

在else循环下,可以检查分配给该键的值的类型。如果类型是字符串,请将其替换为包含当前字符串和新值的列表。如果该值已经是一个列表,请将新值附加到该列表中

  else:
    if type(d[x]) == 'str':
      d[x] = [d[x], x[1]]
    elif type(d[x] == 'list'):
      d[x].append(x[1])

不要使用字典,而是使用defaultdict,然后您可以随时追加

from collections import defaultdict
d = defaultdict(list)

for line in fhand:
  x = line.rstrip("\n")
  x = x.split("\t")
  d[x[0]].append(x[1])

print(d)

使用dict.setdefault

例如:

res = {}
with open(filename) as infile:
    for line in infile:
        key, value = line.strip().split("\t")    #Get key-value from line
        res.setdefault(key, []).append(value)    #Use list to append values. 
print(res)

输出:

{'Camiguin': ['Catarman, Camiguin',
              'Guinsiliban, Camiguin',
              'Mahinog, Camiguin',
              'Mambajao, Camiguin',
              'Sagay, Camiguin'],
 'Catalat San': ['Vicente, Palawan'],
 'Limasawa': ['Limasawa, Southern Leyte'],
 'Pangangan': ['Calape, Bohol'],
 'Rasa': ['Narra, Palawan'],
 'Sandingan': ['Loon, Bohol']}

相关问题 更多 >