如何将字符串与字典并行添加到列表中

时间:2020-05-12 18:42:20

标签: python list sorting dictionary file-io

我正在导入一个文本文件,该文件将行星与行星的状态关联为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)

截至目前的打印状态现在按如下所示显示数据文件的顺序:

[“真”,“真”,“真”,“真”,“真”,“真”,“假”,“真”,“真”]

正确的订单应为列表:

[“真”,“真”,“真”,“真”,“真”,“真”,“真”,“真”,“假”]

2 个答案:

答案 0 :(得分: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']

答案 1 :(得分:0)

您可以先将文件解析为字典,然后遍历sol键并检查解析后的字典中的值,从而实现所需顺序。

<UserControl x:Class="Gui.Views.Tabs.ExamsTabViews.ExamInfoView"
             xmlns:vm="clr-namespace:Gui.ViewModels"
             mc:Ignorable="d" 
             d:DesignHeight="450" d:DesignWidth="800">

    <DataTemplate DataType="vm:ExamInfoViewModel">
        <DockPanel VerticalAlignment="Stretch" HorizontalAlignment="Stretch">

            <!-- contents of the template -->             

        </DockPanel>
    </DataTemplate>
</UserControl>

输出

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)