【问题标题】:Python Dictionary should return a value rather than NonePython 字典应该返回一个值而不是 None
【发布时间】:2019-10-03 18:17:53
【问题描述】:

我有一个 csv 文件,其中包含 a,b 2,3 4,5 4,7 4,7 (其中 a,b 是列值) 下面我有两个函数,第一个函数将读取 csv 并将'a'作为键和'b'作为字典中的值

第二个函数我将'a'值作为参数传递,当我使用该函数时它返回b作为值。如果'a'没有值,我得到None。

def x (id):
    dict1= {}
    with open(file, 'r', encoding='utf') as f:
        for i in csv.DictReader(f, skipinitialspace= True)
        dict1[i['a']] = row['b']
    print('im happy now' )



def getx (a):
    return dict1.get(a, None)

完美运行。

现在我有一个包含四列值的 csv 文件

a,b,c,d
1,2,r,4
2,g,4,6
3,d,4,6

为此,我编写了类似的代码

def x ():
    dict1= {}
    with open(file, 'r', encoding='utf') as f:
        for i in csv.DictReader(f, skipinitialspace= True)
        dict1[i['a']] = dict(dict1[i['b']] = dict(dict1[i['c']] = row['d']))
    print('im happy now' )



def getx (a):
    return dict1.get(dict1['a']['b']['c'], None)

我的逻辑是展示

dict1[i['a']] = dict(dict1[i['b']] = dict(dict1[i['c']] = row['d']))

作为

dict1 :{
   'a':{
       'b':{
           'c':2,
           'c':4,
           'c':4
       }
   }
}

我不确定我上面写的是否正确。

当我传递 dict1[a[]b][c] 时,我需要将 'd' 作为值返回。它返回空值。

期望值是 a,b,c 的组合,我需要一个值作为 d。

例如:从上面的 csv.. 对于 1,2,r 的组合,我需要返回 4 作为输出

更新:

我意识到“a”列具有重复值,并且无法在跳过重复键记录的字典键中处理。

from collections import defaultdict

dict_1 = defaultdict(list)

with open('file.txt','r') as f:
    for r in f.readline():
        i= r['a']
        j= r['b']
        k= r['c']
        l =r['d']
        details = [j,k,l]
        dict_1[i].append((details))
        print(dict_1)

这给了我

{'1' :[('k', '3', '5'),('e','3','2')], '4' :[('r','3','2'),('e','2','1')],....................}

如果我在上面的第一个函数中有 dict_1。 现在,任何建议,例如如何通过在我的第二个函数中传递 a、b、c 作为参数来获取 'd' 的值,否则 NONE?

【问题讨论】:

  • 字典不能针对单个键有多个值。尝试将这些值存储在列表中(针对键)
  • 对于 a、b、c 列,我需要 d 列作为值。因此,如果在列表中,我该如何管理所有内容..
  • 我选择了字典,这样对于 a、b、c 组合我可以获得 d 值....如果在列表中,我不确定我们如何实现。 @rdas
  • 您上面显示的示例是不可能的。但不能这样存储:'c': [2, 4, 4]
  • @rdas 。我看到我的“a”列中有重复项,作为字典,它不接受重复的键值。我错过了其中的许多记录。我们可以用 List 实现吗?

标签: python django python-3.x dictionary


【解决方案1】:

您不需要 csv 模块。此外,字典中不能有重复的键,只能覆盖以前设置的值。

def x():
    dict1= {}
    with open(file, 'r', encoding='utf') as f:
        for i in f.readlines():
            a, b, c, d = i.split(',')
            dict1[a] = {b: {c: d}}

def getx(a, b, c):
    try:
        return dict1[a][b][c]
    except:
        return None

【讨论】:

  • 感谢您的回答,但我看到我的“a”列中有重复项,并且字典不接受重复的键值。我错过了其中的许多记录。如果我们在“a”列中有重复项,还有其他方法可以实现吗
  • 你可以有多个 'a' 值,只要你没有相同的 a,b,c 元组。对于像a,b,c,d 1,2,r,4 1,g,4,6 这样的表,您将拥有像 {1: {2:{'r':4}, 'g': {4:6}}} 这样的字典。如果您不止一次拥有相同的 a、b、c 元组,则可以将这些值添加到列表中:dict1[a][b][c].append(d)。当然,您必须先初始化此列表,然后再添加它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-08-09
  • 2013-12-24
  • 1970-01-01
  • 2015-07-03
  • 2018-06-25
  • 2018-11-01
  • 1970-01-01
相关资源
最近更新 更多