当前位置: 首页 > 知识库问答 >
问题:

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

荆学民
2023-03-14

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

现在的打印(状态)按数据文件的顺序给出,如下所示:

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

正确的顺序是列表:

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

共有2个答案

郏博瀚
2023-03-14

您可以通过首先将文件解析为判决,然后遍历sol键并检查解析的判决中的值来实现期望的顺序。

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']
和光启
2023-03-14

最小化对代码的更改

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

补遗

创建状态而不修改溶胶

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']
 类似资料:
  • 我正试图连载我的表格,但由于某种原因我不能使它工作。表单的系列化工作正在进行。但问题是,我需要在之后添加一个列表,因为它不是表单的一部分,并且在这样做时,当它到达我的控制器endpoint时,我的模型是空的。 我正在打的控制器的功能: 对象产品运行良好,但模型为。 有没有人有什么建议,如何解决这个问题?:-) 请不要介意像Model这样的对象的名称,这在我们的项目中被命名为其他的东西。

  • 给一本字典: 如何将键附加到列表中? 我走了这么远:

  • 问题内容: 问题 我正在以以下方式创建一个空列表作为值的字典。 字典看起来像这样。 当我将一个值附加到一个列表时,此示例将值附加到所有列表。 问题 我的问题分为两部分。首先,为什么会这样?第二,我该怎么办?也就是说,如何将一个值仅附加到一个列表中? 我想象在创建字典时,我使所有列表都指向同一个对象。但是我不明白怎么回事,因为当我输入而不是在字典创建中,然后添加值而不是附加值时,这些值的行为会不同,

  • 问题内容: 有没有更优雅的方式来编写此代码? 我在做什么:我有键和日期。可能有多个日期分配给键,因此我正在创建一个包含日期列表的字典来表示这一点。以下代码可以正常工作,但是我希望有一个更优雅和Pythonic的方法。 我期望下面的工作,但我不断得到一个NoneType没有属性附加错误。 这可能与以下事实有关: 但为什么? 问题答案: 返回,因为它是就地操作,并且您将其分配回。因此,下一次您实际要做

  • 问题内容: 我有一个清单 我想将其转换为字典 我该怎么做? 问题答案: 采用: 返回: 如果需要整数,请在以下位置更改分配: 这将给出:

  • 问题内容: 我该如何列出这样的词典列表。 …变成这样的单个字典: 问题答案: 这适用于任何长度的字典: 作为一个理解: