例えば、
string = "['SING', 'Dance'],['Talk', 'Scream'],['Run', 'Walk']"
上記の各リストを新しいリストの要素として使用して新しいリストを作成するにはどうすればよいですか?
やってみた
string = string.split (',')
しかし、リスト内でもコンマで分割されます。これは私が望んでいないことです。
使用できますast.literal_eval
:
>>> import ast
>>> strs = "['SING', 'Dance'],['Talk', 'Scream'],['Run', 'Walk']"
>>> ast.literal_eval("[" + strs + "]")
[['SING', 'Dance'], ['Talk', 'Scream'], ['Run', 'Walk']]
>>> eval("['SING', 'Dance'],['Talk', 'Scream'],['Run', 'Walk']")
>>> (['SING', 'Dance'], ['Talk', 'Scream'], ['Run', 'Walk'])
>>>
>>> list(eval("['SING', 'Dance'],['Talk', 'Scream'],['Run', 'Walk']"))
>>> [['SING', 'Dance'], ['Talk', 'Scream'], ['Run', 'Walk']]
評価された文字列の前と最後に noがないのにeval("'a',2,[12,'bb']")
returnが返されるのはなぜですか? アンパッキングを実行する式の正しい部分として、評価された式に遭遇したときにインタプリタがどのように動作するか
を考えなければなりません。
インタープリターが次の行を実行すると (括弧はありません)('a', 2, [12, 'bb'])
(
)
x,y,z = 'a',2,[12,'bb']
実行される内容:
- 右側の部分の評価、 eval("'a',2,[12,'bb']")
それが実行され、タプルが作成されます
- 左側の部分の評価
- 左側のタプルでの右側のタプルのアンパック
特定の例で機能するワンライナー:
>>> string = "['SING', 'Dance'],['Talk', 'Scream'],['Run', 'Walk']"
>>> [x.split(', ') for x in string[1:-1].replace("'", "").split('],[')]
[['SING', 'Dance'], ['Talk', 'Scream'], ['Run', 'Walk']]
これは、配置したとおりに正確に機能する文字列に依存するため、脆弱です。次の手順が適用されます。
string[1:-1]
-文字列を括弧で囲んだ[
とを捨てます。]
replace("'")
- 単一引用符は分割に役立たないため、すべて捨ててください。split('],[')
- サブリストを接続する部分文字列で最も外側の文字列を分割します。[x.split(', ')
for x in ... - FOR EACH GENERATED SUBSTRING, split that substring on its internal pair connector - in this case
、 `。これは、本当に良いアイデアというよりも、これが可能であるという概念の証明です。これは非常に脆弱なソリューションです。間隔や引用符の不規則性が原因で壊れてしまうからです。
より良い解決策は、正規表現を使用してリストに一致する部分文字列を見つけ、それらのリストを取得し、それらをリストに処理することです。
regex_string = '(?<=\[)[^\]]+(?=\])'
matcher = re.compile(regex_string)
substring_list = matcher.findall(string)
list_of_lists = [x.split(', ') for x in substring_list]