Как создать новые словари для заданных c ключевых значений? - PullRequest
0 голосов
/ 07 августа 2020

Для каждого элемента в файле (строке) мне нужно создать новый словарь, где ключи - это имена свойств из строки заголовка (Atomi c Number, Atomi c Name, et c) и значения - это значения для каждого свойства. Однако я не могу создать специальный словарь c для каждого элемента. Мой вывод полностью отличается от данного вывода. Это задание, поэтому получение всего кода не имеет смысла. Можете ли вы сказать мне, в чем моя ошибка, как я могу ее исправить?

Это мои короткие исходные данные введенного файла:

Chemical symbol     Name    Origin of symbol    Atomic Number   Atomic mass     Density Melting point   Boiling point   Year of discovery   Discoverer
Ac  Actinium        89  227.0278    10.07   1047    3197    1899    Debierne
Ag  Silver  Latin Argentum  47  107.8682    10.49   961.9   2212    prehistoric     unknown
Al  Aluminium       13  26.981539   2.70    660.5   2467    1825    Oersted
Am  Americium       95  243.0614    13.67   994     2607    1944    Seaborg
Ar  Argon       18  39.948  1.66 g/l    -189.4  -185.9  1894    Ramsay and Rayleigh

Мой короткий вывод выглядит следующим образом:

|Chemical symbol    Name    Origin of symbol    Atomic Number   Atomic mass     Density Melting point   Boiling point   Year of discovery   Discoverer : Co     Cobalt      27  58.9332     8.89    1495    2870    1735    Brandt
|Chemical symbol    Name    Origin of symbol    Atomic Number   Atomic mass     Density Melting point   Boiling point   Year of discovery   Discoverer : Cr     Chromium        24  51.9961     7.14    1857    2482    1797    Vauquelin 

Однако желаемый результат будет таким:

    |Element Name       :   Hydrogen
    |Chemical symbol    :   H
    |Origin of symbol   :   
    |Atomic Number      :   1.00
    |Atomic mass        :   1.01
    |Density            :   0.084 g/l 
    |Melting point      :   -259.1
    |Boiling point      :   -252.9
    |Year of discovery  :    1766
    |Discoverer         :   Cavendish

Вот мой код:

class Element:
    def __init__(self, eName, elementData):
        self.__eName = str(eName)
        self.elementData = dict(elementData)
    
        for e in self.elementData:
            if isinstance(self.elementData[e],int) or isinstance(self.elementData[e],float):
                float(elementData[e])

    def __eq__(self,other):
        if self.__eName == other.__eName:
            return True
        else:
            return False
            
    def __lt__(self, other):
        if self.elementData['Atomic Number'] < other.elementData['Atomic Number']:
            return True
        else:
            return False
        
    def __repr__(self):
        for k in self.elementData:
            return "|"+ k +' : '+ self.elementData[k]+'\n'
        
    def get_property(self, property):
        return self.elementData[property]
import numpy as np
from Element import *

file = np.loadtxt("data.txt",dtype = "str", delimiter = "|t")

dict1 = {}

for i in range(1,len(file)):
    for col in np.row_stack((file[0],file[i])).T:
        key = col[0]
        dict1[key] = col[1]
    
    el_Name = dict1[key]
    elem = Element(el_Name, dict1)
    print(elem)

Ответы [ 2 ]

1 голос
/ 07 августа 2020

Опираясь на ответ гудка .

Чтобы получить красивый отступ, который вы изначально запрашивали, и сделать больше pythoni c итерация словаря :

def __repr__(self):
       maxKeyLength = max([len(k) for k in self.elementData])
       s = ''
       for key, value in self.elementData.items():
           s += f"|{key:maxKeyLength}  :  {value}\n"
       return s
1 голос
/ 07 августа 2020

Символ разделителя (|t) в этой строке неверен:

file = np.loadtxt("data.txt",dtype = "str", delimiter = "|t")

он должен быть (\t) для представления символа табуляции ( см. docs ):

file = np.loadtxt("data.txt",dtype = "str", delimiter = "\t")

С неправильным разделителем каждая строка читается как отдельный столбец. Вы можете увидеть последствия этого, распечатав значение dict1, которое показывает, что существует только одна пара ключ-значение:

el_Name = dict1[key]
print(dict1)  # print the value of dict1 for debugging/illustration purposes
elem = Element(el_Name, dict1)
output: {'Chemical symbol\tName\tAtomic Number\tAtomic mass\tDensity\tMelting point\tBoiling point\tYear of discovery\tDiscoverer': 'Ac\tActinium\t89\t227.0278\t10.07\t1047\t3197\t1899\tDebierne'}

После исправления разделителя значение dict1 выглядит вот так:

output: {'Chemical symbol': 'Ac', 'Name': 'Actinium', 'Atomic Number': '89', 'Atomic mass': '227.0278', 'Density': '10.07', 'Melting point': '1047', 'Boiling point': '3197', 'Year of discovery': '1899', 'Discoverer': 'Debierne'}

Теперь есть пары ключ-значение для каждого свойства химического вещества.

После исправления вы можете столкнуться с другой проблемой в вашей функции __repr__. Он перебирает каждое из химических свойств, но возвращается в начале первой итерации l oop, поэтому вы увидите только первое свойство для каждого химического вещества.

    def __repr__(self):
        for k in self.elementData:
            return "|"+ k +' : '+ self.elementData[k]+'\n'  # this returns immediately! we only see the first value from self.elementData

Вы можете исправить это создавая свойства одно за другим, затем возвращайтесь за пределы for l oop, например:

    def __repr__(self):
        s = ''
        for k in self.elementData:
            s += "|"+ k +' : '+ self.elementData[k]+'\n'
        return s

С этими изменениями мой результат выглядит так:

(мне пришлось удалить столбец «Происхождение символа» из-за отсутствующих значений в данных примера)

|Chemical symbol : Ac
|Name : Actinium
|Atomic Number : 89
|Atomic mass : 227.0278
|Density : 10.07
|Melting point : 1047
|Boiling point : 3197
|Year of discovery : 1899
|Discoverer : Debierne
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...