簡體   English   中英

Python CSV解析字典和查找元素的索引

[英]Python CSV Parsing Dictionary and Finding Elements' Indices

我有一個要在Python程序中使用的CSV字典dictionary.txt。 我已經使用標准庫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

如果文件的第一行不是“ Difficulty line”,這將不起作用。 這將構建以下的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錯誤的問題嗎?

希望對您有所幫助!

您可以按照以下方式進行操作:

import csv

with open('dictionary.txt', 'r') as f:
    data={}
    k=None 
    for row in csv.reader(f):
        print row
        if row[1] in ' ##### EASY ##### ##### MEDIUM ##### ##### HARD #####':
            k=row[1].strip()
            data[k]={}
        elif k:
            data[k][row[0]]=row[1]

產生:

>>> data
{'##### HARD #####': {'key6': ' value6', 'key5': ' value5'}, '##### EASY #####': {'key2': ' value2', 'key1': ' value1'}, '##### MEDIUM #####': {'key3': ' value3', 'key4': ' value4'}}

然后訪問data[category][key_you_want_in_category]

請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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM