Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/280.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何将字符串与字典并行地附加到列表中_Python_List_Sorting_Dictionary_File Io - Fatal编程技术网

Python 如何将字符串与字典并行地附加到列表中

Python 如何将字符串与字典并行地附加到列表中,python,list,sorting,dictionary,file-io,Python,List,Sorting,Dictionary,File Io,我正在导入一个文本文件,该文件将行星与其状态关联为True(对于行星),或False(对于矮星),其顺序必须与下面的字典键相同 这是一本名为“索尔”的字典: {‘天王星’:[275030002880],‘水星’:[46,70,57],‘地球’:[147152150],‘金星’:[107109108],‘火星’:[205249228],‘土星’:[13501510140],‘木星’:[74181779],‘海王星’:[445045504500],‘冥王星’:[444073805910]} 这是我正

我正在导入一个文本文件,该文件将行星与其状态关联为True(对于行星),或False(对于矮星),其顺序必须与下面的字典键相同

这是一本名为“索尔”的字典:

{‘天王星’:[275030002880],‘水星’:[46,70,57],‘地球’:[147152150],‘金星’:[107109108],‘火星’:[205249228],‘土星’:[13501510140],‘木星’:[74181779],‘海王星’:[445045504500],‘冥王星’:[444073805910]}

这是我正在导入的名为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)
现在的打印(状态)按数据文件的顺序给出,如下所示:

[‘真’、‘真’、‘真’、‘真’、‘真’、‘假’、‘真’、‘真’]

列表的正确顺序如下:


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

最小化对代码的更改

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']}
输出

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
用法

输出

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

最小化对代码的更改

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']}
输出

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
用法

输出

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

您可以通过首先将文件解析为dict,然后迭代sol键并检查解析的dict中的there值来实现所需的顺序

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']

您可以通过首先将文件解析为dict,然后迭代sol键并检查解析的dict中的there值来实现所需的顺序

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']

你不必担心口述的顺序。只要用
sol[key]
索引就可以了。你不必担心口述的顺序。只要用
sol[key]
索引就可以了。谢谢Darryl,不过,我需要一个名为status with they的单独列表,以便让其他功能工作。此列表将按正确的顺序操作一次,然后将对字典进行更改。@jasonmckinney--顺序是否基于文件中的顺序?@jasonmckinney--请参阅更新。函数根据文件中的顺序返回状态。@jasonmckinneny——是,应该可以。或者,如果不需要该值,则可以在不更新sol的情况下更新状态。你看到代码将如何改变以实现这一点吗?@jasonmckinney——我添加了一个附录,在不修改sol的情况下创建状态。比我想象的要复杂。不过,谢谢Darryl,我需要一个名为status with they的单独列表,以便允许其他功能工作。此列表将按正确的顺序操作一次,然后将对字典进行更改。@jasonmckinney--顺序是否基于文件中的顺序?@jasonmckinney--请参阅更新。函数根据文件中的顺序返回状态。@jasonmckinneny——是,应该可以。或者,如果不需要该值,则可以在不更新sol的情况下更新状态。你看到代码将如何改变以实现这一点吗?@jasonmckinney——我添加了一个附录,在不修改sol的情况下创建状态。比我想象的要复杂。