如何将一个字符串与字典并行追加到一个列表中

问题描述 投票:0回答:1

我正在导入一个文本文件,它将行星与它们的状态联系起来,要么是True--行星,要么是False--矮星,必须与下面的字典键的顺序相同。

下面是名为 "sol "的字典。

{"天王星": [2750, 3000, 2880], '水星': [46, 70, 57], '地球': [147, 152, 150], '金星': [107, 109, 108], '火星': [205, 249, 228], '土星': [1350, 1510, 1430], '木星': [741, 817, 779], "海王星": [4450, 4550, 4500], '冥王星': [4440, 7380, 5910]}

这是我导入的数据文件,名为status1.dat。

Mars,True
Mercury,True
Neptune,True
Uranus,True
Earth,True
Venus,True
Pluto,False
Jupiter,True
Saturn,True

所以下面的代码,我被告知不要用CSV,只用标准循环,我的逻辑是打开数据文件。把这几行拆开,这样我就可以把星球名称 "li[0]"和sol[key]匹配起来。如果它们确实匹配,那么就把状态 "li[1]"追加到列表的最后。当然,这是按数据文件的顺序去做的,而不是按字典的键。有没有办法改变下面的代码,让状态与键值一致?还是我必须先把字典键循环?

status =[]

def load_status(sol, status):
    with open(status1.dat, "r") as s:
        for line in s:
            line = line.rstrip('\n')
            if len(line) > 0:
                li = line.split(',')
                for key in sol:
                    if key == li[0]:
                        status.append(li[1])
        print(status)

Print(status)目前给出的数据文件顺序如下图所示,现在。

['True', 'True', 'True', 'True', 'True', 'False', 'True', 'True']

正确的顺序是:

['真','真','真','真','真','真','假']

python list sorting dictionary file-io
1个回答
0
投票

尽量减少对代码的修改

def load_status(sol):

  with open('status1.dat', "r") as s:
      for line in s:
          line = line.rstrip('\n')
          if len(line) > 0:
              k, v = line.split(',')  # get key, value from line
              if k in sol:            # if key in dictionary
                sol[k].append(v)      # append value to did entry

      # Create status (looping in same order as keys)
      # based upon last item in list i.e. v[-1]
      status = [v[-1] for k, v in sol.items()] 

      return sol, status

测试

new_sol, status = load_stats(sol)

print(status)

from pprint import pprint
pprint(new_sol)                       # pretty print dictionary

产量

['True', 'True', 'True', 'True', 'True', 'True', 'True', 'True', 'False']

{'Earth': [147, 152, 150, 'True'],
 'Jupiter': [741, 817, 779, 'True'],
 'Mars': [205, 249, 228, 'True'],
 'Mercury': [46, 70, 57, 'True'],
 'Neptune': [4450, 4550, 4500, 'True'],
 'Pluto': [4440, 7380, 5910, 'False'],
 'Saturn': [1350, 1510, 1430, 'True'],
 'Uranus': [2750, 3000, 2880, 'True'],
 'Venus': [107, 109, 108, 'True']}

增编

无需修改sol即可创建状态

def load_status(sol):

  with open('status1.dat', "r") as s:
      # create a lookup table for each sol key
      sol_key_index = {k:i for i, k in enumerate(sol.keys())}
      # Make status array the size of the keys
      status = [0] * len(sol.keys())
      for line in s:
          line = line.rstrip('\n')
          if len(line) > 0:
              k, v = line.split(',')             # get key, value from line
              if k in sol:                       # if key in dictionary
                status[sol_key_index[k]] = v     # append value to status

      return status

使用方法

status = load_status(sol)

产量

['True', 'True', 'True', 'True', 'True', 'True', 'True', 'True', 'False']

0
投票

你可以通过先将文件解析为一个dict,然后在sol键上迭代,并在解析的dict中检查其值来实现你想要的顺序。

def load_status(sol):
    with open(status1.dat, "r") as s:
        stat_dc = {i.split(",")[0]: i.split(",")[1] for i in s.split("\n")
        status = [stat_dc[i] for i in sol]
        print(status)

輸出結果

['True', 'True', 'True', 'True', 'True', 'True', 'True', 'True', 'False']
© www.soinside.com 2019 - 2024. All rights reserved.