python 我想从一个带值的字符串Map到两个列表

y3bcpkx1  于 2023-02-21  发布在  Python
关注(0)|答案(4)|浏览(120)

我有一个巨大的多线弦它的结构就像

'''
"key0": "value0",
"key1": "value1",
"key2": "value2",
'''

我想把它变成两个列表:一个用于所有键,一个用于所有值。
除了字符串之外,没有其他方法可以接收此数据。
列表的顺序应该相同。运行print(keys[0])应该返回字符串"key0"
我该怎么做?我是Python新手

5us2dqdw

5us2dqdw1#

你可以这样做:

multiline_str = '''
"key0": "value0",
"key1": "value1",
"key2": "value2",
'''

lines = multiline_str.strip().split('\n')

lines = [line.rstrip(', ') for line in lines]

pairs = [line.split(': ') for line in lines]

keys = [pair[0].strip('"') for pair in pairs]
values = [pair[1].strip('"') for pair in pairs]

print(keys[0])
print(values[0])

结果:

key0
value0
bybem2ql

bybem2ql2#

假设字符串看起来是粗糙的JSON/Python dict格式,那么可以使用下面的代码将键和值读入各个列表,只需要 * 最少 * 的字符串操作。

import ast  # Optional
import json

s = '''
"key0": "value0",
"key1": "value1",
"key2": "value2"  # <-- Trailing comma removed.
'''

# Add curly braces to the start and end of string.
s_ = f'{{{s}}}'
# Read JSON-like string into a Python dict.
d = json.loads(s_)
# Option to address trailing comma.
#d = ast.literal_eval(s_)

# Extract keys and values as lists.
keys = list(d.keys())
values = list(d.values())

输出:

>>> keys, values
(['key0', 'key1', 'key2'], ['value0', 'value1', 'value2'])
    • 有关尾随逗号的注解:**

如果不可能(或者很麻烦)删除尾部逗号,那么ast库可以提供帮助,只需将json.loads(s_)调用替换为ast.literal_eval(s_),尾部逗号就不再是问题了。

5vf7fwbs

5vf7fwbs3#

如果你有一个很大的数据集,你可以尝试使用re.finall()代替传统的循环,看看这是否有帮助:
r'"(.*?)"\s*:'匹配后跟冒号的引号字符串,表示键; r':\s*"(.*?)"\s*,'匹配冒号、引号字符串和逗号,表示值。

import re

data_str = '''
"key0": "value0",
"key1": "value1",
"key2": "value2",
'''

keys = re.findall(r'"(.*?)"\s*:', data_str)
values = re.findall(r':\s*"(.*?)"\s*,', data_str)

print(keys)
print(values)
['key0', 'key1', 'key2']
['value0', 'value1', 'value2']
mqkwyuun

mqkwyuun4#

通过 * dict * 构造,可以方便地为您提供单独的键和值:

d = dict([map(lambda s: s.strip('"'), row.strip().split(': '))
          for row in s.split(',') if row.strip()])
print(d.keys())
print(d.values())
dict_keys(['key0', 'key1', 'key2'])
dict_values(['value0', 'value1', 'value2'])

您可以将它们转换为列表或继续使用口述。

相关问题