Почему я не могу получить список ключей словаря в Python3 .6? - PullRequest
0 голосов
/ 12 февраля 2020

Я учусь Python. Я пытался получить ключи от словаря. Но я получаю только последний ключ. В моем понимании метод keys () используется для получения всех ключей в словаре.

Ниже приведены мои вопросы?

1. Why I cannot get all keys? 
2. If I have a dictionary, how can I get the value if I know the key? e.g. dict = {'Ben':8, 'Joe':7, 'Mary' : 9}. How can I input the key = "Ben", so the program can output the value 8? The tutorial shows that the key must be immutable. This constraint is very inconvenient when trying to get a value with a given key. 

Любое предложение будет высоко оценено.

Вот мой код.

import os, tarfile, urllib

work_path = os.getcwd()
input_control_file = "input_control"
import os, tarfile, urllib

work_path = os.getcwd()
input_control_file = "input_control"
input_control= work_path + "/" + input_control_file

#open control file if file exist
#read setting info
try:
   #if the file does not exist,
   #then it would throw an IOError
   f = open(input_control, 'r')

   #define dictionary/hash table
   for LINE in f:
      LINE = LINE.strip()     #remove leading and trailing whitespace
      lst = LINE.split()      #split string into lists
      lst[0] = lst[0].split(":")[0]
      dic = {lst[0].strip():lst[1].strip()}

except IOError:
   # print(os.error) will <class 'OSError'>
   print("Reading file error. File " + input_control + " does not      exist.")

#get keys
def getkeys(dict):
   return list(dict.keys())
print("l39")
print(getkeys(dic))
print("end")

Ниже приведены выходы.

l39
['source_type']
end

Ответы [ 2 ]

2 голосов
/ 12 февраля 2020

Причина в том, что вы снова переназначаете переменную dic для l oop. Вы не обновляете и не добавляете словарь, вместо этого вы переназначаете переменную. В этом случае dic будет иметь только последнюю запись. Вы можете изменить for l oop на:

<b>dic = {}</b>
for LINE in f:
    LINE = LINE.strip()     #remove leading and trailing whitespace
    lst = LINE.split()      #split string into lists
    lst[0] = lst[0].split(":")[0]
    <b>dic.update({lst[0].strip():lst[1].strip()})</b> # update the dictionary with new values.

По вашему другому вопросу, если у вас есть словарь dic = {'Ben':8, 'Joe':7, 'Mary' : 9}, вы можете получить значение следующим образом: dic['Ben']. Он вернет значение 8 или повысит KeyError, если ключ Ben не найден в словаре. Чтобы избежать KeyError, вы можете использовать get() метод словаря. Он вернет None, если указанный словарь не найден в словаре.

val = dic['Ben'] # returns 8
val = dic['Hen'] # will raise KeyError
val = dic.get('Hen') # will return None
0 голосов
/ 12 февраля 2020

В вашем for l oop вы переинициализируете значение словаря, в то время как вам необходимо обновить словарь, то есть добавить пару ключ-значение в уже существующий словарь. Для этого используйте dic.update({lst[0].strip() : lst[1].strip()}) Это обновит пару ключ-значение в словаре. Теперь, когда вы используете dic.keys(), вы получите все ключи dic в виде списка.

Что касается вашего второго вопроса, получите доступ к словарю, так же, как и к списку, за исключением того, что список доступ с помощью индексов, а словарь будет доступен по ключам. Скажем, у вас есть список и словарь как

lst = [1, 2, 3, 4, 5]
dic = {'a' : 1, 'b' : 2, 'c' : 3, 'd' : 4, 'e' : 5}

Чтобы получить значение 2 из списка, вы делаете lst[1], т.е. значение по индексу 1. Аналогично, если вы хотите получить значение 2 из словарь do dic['b'], т. е. значение ключа 'b'. Это так просто.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...