【问题标题】:Iterate through two lists of strings simultaneously同时遍历两个字符串列表
【发布时间】:2020-06-04 13:32:11
【问题描述】:

我找到了我希望的答案here

就我而言,我有 2 个字符串列表。从此代码:

fields = POST[ 'fields' ]
values = POST[ 'row' ]

for ( field, value ) in zip( fields, values ):
    f.write(   f'  field {field}, value {value}\n' )

...这是我得到的:

row: [4,1,"AAR",null,null,"Aardvark Ltd",null,"2019-07-20 00:00:00","modem - ring first","M",null,null,"",null,null]
fields: ["id","category","code","title","firstname","secondname","salutation","lastcon","sendconventions","stdsendmethod","vatno","refquote","notes","created","lastmodif"]
  field [, value [
  field ", value 4
  field i, value ,
  field d, value 1
  field ", value ,
  field ,, value "
  field ", value A
  field c, value A
  field a, value R
  field t, value "
  ...

它将字符串分解为字符,甚至包括方括号、引号和逗号。我该如何防止这种情况?我希望它在迭代时列出字符串对(每个列表中的 1 个)。

【问题讨论】:

  • 如果这样做,fieldsrow 不是列表,它们是字符串。要转换它们,您需要here

标签: python string iteration


【解决方案1】:

我假设您从 http 请求正文中获取这些字段和值。 在这种情况下,您可以做的就是使用 literal_eval https://docs.python.org/3/library/ast.html#ast.literal_eval 将数据转换为实际的 Python 列表并对其进行迭代。

在你的情况下:

from ast import literal_eval
fields = literal_eval(POST['fields'])
values = literal_eval(POST['row'])

然后尝试迭代它们。

【讨论】:

  • 谢谢...是的,确实如此。我曾假设json.loads 会以原始方式对这些对象进行魔术处理。我确定您的方法是可行的,但我目前遇到错误:“'ValueError'> throw: malformed node or string: <_ast.name object at>” ...正在调查...
  • 我假设这是因为字符串中的null 而不是None
  • Right... 并且将出现的“null”转换为“None”显然不是微不足道的:在其中一个字符串中,还是列表中真正的 null 元素?想知道json 中的某些东西是否可以处理这种情况?
  • 是的。 docs.python.org/3/library/json.html#json.loads 这应该可以完成工作。
  • 我在 JS 中犯了双字符串化的错误。现在一切正常,不需要literal_eval。很抱歉浪费您的时间。
【解决方案2】:

@迈克: 您是否首先检查以确认它们确实是列表?您可以使用以下命令来做到这一点:

    print(type(fields)) 
    print(type(values)) 

使用 zip 循环两个列表的一般方法以及您这样做的方式确实是正确的。但是,我认为您正在处理请求包中的对象,而不是列表。

【讨论】:

  • 对不起!!我的天真。是的,这些是字符串。道歉。
【解决方案3】:

根据您的输出,字段和值是 strs 而不是 lists。解决方案可能涉及使用 python 的 ast.literal_eval 将值转换为 lists。

from ast import literal_eval
fields = literal_eval(POST['fields'])
values = literal_eval(POST['row'])

for field, value in zip(fields, values):
    f.write(f'  field {field}, value {value}\n')

更多关于ast.literal_eval的信息可以在here找到。

【讨论】:

    猜你喜欢
    • 2015-03-09
    • 1970-01-01
    • 2011-08-03
    • 1970-01-01
    • 1970-01-01
    • 2021-04-05
    • 2014-09-19
    • 1970-01-01
    相关资源
    最近更新 更多