【问题标题】:Data Structure Option数据结构选项
【发布时间】:2021-08-27 04:17:35
【问题描述】:

我想知道我将使用什么合适的数据结构来存储有关我在文本文件中拥有的化学元素的信息。我的程序应该 读取和处理来自用户的输入。如果用户输入一个整数,那么它会编程 应该显示带有质子数的元素的符号和名称 进入。如果用户输入一个字符串,那么我的程序应该显示数字 具有该名称或符号的元素的质子数。

文本文件格式如下

# element.txt

1,H,Hydrogen
2,He,Helium
3,Li,Lithium
4,Be,Beryllium
...

我想到了字典,但认为将字符串映射到列表可能会很棘手,因为我的程序会根据用户是提供整数还是字符串来做出响应。

【问题讨论】:

  • 这是一个练习编程的项目,还是你学习化学元素信息的实际方法?如果是后者,那么有非常适合这项任务的抽认卡软件。
  • 只是为了练习。

标签: python-3.x data-structures


【解决方案1】:

你不应该担心寻找元素的“性能”:

  • 元素不超过 200 个,对于计算机来说是个小数目;
  • 由于程序与人类用户交互,因此人类无论如何都会比计算机慢几个数量级。

选项 1:pandas.DataFrame

因此我建议一个简单的pandas DataFrame:

import pandas as pd

df = pd.read_csv('element.txt')
df.columns = ['Number', 'Symbol', 'Name']

def get_column_and_key(s):
  s = s.strip()
  try:
    k = int(s)
    return 'Number', k
  except ValueError:
    if len(s) <= 2:
      return 'Symbol', s
    else:
      return 'Name', s

def find_element(s):
  column, key = get_column_and_key(s)
  return df[df[column] == key]

def play():
  keep_going = True
  while keep_going:
    s = input('>>>> ')
    if s[0] == 'q':
      keep_going = False
    else:
      print(find_element(s))

if __name__ == '__main__':
  play()

另见:

选项 2:三个冗余字典

python 最常用的数据结构之一是dict。这里我们有三个不同的可能键,所以我们将使用三个 dict。

import csv

with open('element.txt', 'r') as f:
  data = csv.reader(f)
  elements_by_num = {}
  elements_by_symbol = {}
  elements_by_name = {}
  for row in data:
    num, symbol, name = int(row[0]), row[1], row[2]
    elements_by_num[num] = num, symbol, name
    elements_by_symbol[symbol] = num, symbol, name
    elements_by_name[name] = num, symbol, name

def get_dict_and_key(s):
  s = s.strip()
  try:
    k = int(s)
    return elements_by_num, k
  except ValueError:
    if len(s) <= 2:
      return elements_by_symbol, s
    else:
      return elements_by_name, s

def find_element(s):
  d, key = get_dict_and_key(s)
  return d[key]

def play():
  keep_going = True
  while keep_going:
    s = input('>>>> ')
    if s[0] == 'q':
      keep_going = False
    else:
      print(find_element(s))

if __name__ == '__main__':
  play()

【讨论】:

    【解决方案2】:

    你说得对,这很棘手。但是,我建议您只制作三个字典。您当然可以将数据存储在二维列表中,但这比使用三个字典更难制作和访问。如果您愿意,可以将三个字典合二为一。我个人不会,但最终的选择始终取决于您。

    weight = {1: ("H", "Hydrogen"), 2: ...}
    symbol = {"H": (1, "Hydrogen"), "He": ...}
    name = {"Hydrogen": (1, "H"), "Helium": ...}
    

    如果您想了解数据库和一些 QL,我建议您查看 sqlite3。这是一部经典之作,因此有据可查。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-12-24
      • 2011-12-23
      • 1970-01-01
      • 1970-01-01
      • 2010-10-16
      相关资源
      最近更新 更多