Python CSV解析字典和查找元素指数

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (207)

我有一个CSV字典dictionary.txt,我想在我的Python程序中使用。我已经使用标准库csv来打开文档。这些是用户输入以选择难度的难度级别。如果用户选择“EASY”,我希望能够忽略标题,并且能够获得标题“EASY”下的元素数量,直到下一个难度之前。标题前面的数字是难度级别。我在这些标题之间有标题和数据,类似于:

1, ##### EASY #####
key1, value1
key2, value2
2, ##### MEDIUM #####
key3, value3
key4, value4
3, ##### HARD #####
key5, value5
key6, value6

我想为每个部分返回词典中有用元素的字典类型(只是键n,值n),还有一个“ALL”选项。我当前的代码看起来像这样,但我不知道该怎么做:

with open("PLUG_dict.txt", "r") as db:
    mydict = dict(csv.reader(db))
for key in mydict.keys():
    if len(key) == 1:
        sections.append(mydict[key])

我如何:

  • 找到指定难度的行的索引(开头和结尾)?
  • 找出困难之间的元素数量?
  • 处理最后一个难度,“HARD”,以便将它运行到字典末尾不会出错?
  • 如果我想要包含一个分类,“ALL”,它只返回字典中的所有有用元素,该怎么做?
提问于
用户回答回答于

在您的代码中,当您将文件的内容转换为字典时,您将失去订单,因为dict无序:

>>> dict(csv.reader(db))
{
  '1': ' ##### EASY #####',
  '3': ' ##### HARD #####',
  '2': ' ##### MEDIUM #####',
  'key3': ' value3',
  'key2': ' value2',
  'key1': ' value1',
  'key6': ' value6',
  'key5': ' value5',
  'key4': ' value4'
}

例如,您可以遍历csv.reader(f)返回的内容,以准确映射文件中的内容:

mydict = {}

with open("PLUG_dict.txt", "r") as db:
    for key, val in csv.reader(db):
        if len(key) == 1:
           # Difficulty line
           dif = key
           # Construct the entry for this difficulty, and save its name
           mydict[dif] = { 'name' : val }
        else:
           # key, val line
           # Simply add it in the dict of the current difficulty
           mydict[dif][key] = val

如果您的文件的第一行不是“难度线”,这将不起作用。这将构建以下内容mydict

{
  '1': {
    'name': ' ##### EASY #####',
    'key1': ' value1',
    'key2': ' value2'
  },
  '3': {
    'name': ' ##### HARD #####',
    'key5': ' value5',
    'key6': ' value6'
  },
  '2': {
    'key3': ' value3',
    'name': ' ##### MEDIUM #####',
    'key4': ' value4'
  }
}

你确实可以改变'name'处理的方式。

然后,dif = '1'你可以:

  • 找到指定难度的值: mydict[dif] 将返回 { 'name': ' ##### EASY #####', 'key1': ' value1', 'key2': ' value2' }
  • 找出难度下的元素数量: len(mydict[dif]) - 1 将返回 2 在这里,- 1必须'name'从计数中删除。根据您的处理方式'name',可以将其丢弃。
  • 返回字典中每个难度下的所有元素: { key: val for elements in mydict.values() for key, val in elements.items() if key != 'name' } 将返回 { 'key3': ' value3', 'key2': ' value2', 'key1': ' value1', 'key6': ' value6', 'key5': ' value5', 'key4': ' value4' } 此外,根据您的处理方式'name'if key != 'name'可以省略条件。
  • 我不确定是否理解有关HARD错误的问题?

我希望它有所帮助!

用户回答回答于

请问Python的数据类型比csv更适合这种类型

请使用plug_dict.py并将其放入其中

levels = {'EASY': ["value 1", "value 2"],
      'MEDIUM': ["value 3", "value 4"],
      'HARD': ["value 5", "value 5"]
}

并做:

from plug_dict.py import levels

SECTIONS = []


#index of a particular line
Unnecessary, get the values instead
values_of_sect = levels['HARD']

# THE DIFFICULTIES
for key in levels:
    SECTIONS.append(key)


# no of elements in between difficulties
# do
elements = len(levels['HARD'])

# Handle the 'HARD' difficulty
unnecessary, python types handles it beautifully, you will get no errors

扫码关注云+社区

领取腾讯云代金券