這是玩具示例,我有這樣的字串:
import numpy as np
z = str([np.nan, "ab", "abc"])
列印它看起來像"[nan, 'ab', 'abc']",但我必須處理z = str([np.nan, "ab", "abc"])
我想從不z包括 nan 的字串串列中獲取:
zz = ["ab", "abc"]
要清楚:z是輸入(字串,看起來像串列),zz是想要輸出(串列)
如果z不包含 nan 則沒有問題,這樣ast.literal_eval(z) 可以完成這項作業,但是使用 nan 我會收到有關格式錯誤的節點或字串的錯誤。
注意: np.nan不一定是第一個。
uj5u.com熱心網友回復:
據我了解,您的目標是決議 csv 或類似內容。
如果您想要一個在大多數情況下都可以使用的權衡解決方案,您可以使用正則運算式來擺脫“nan”。它會在包含子字串nan,(帶逗號)的字串上失敗,但這似乎是一個不太可能的極端情況。值得與您一起爆炸的真實資料。
z = str([np.nan, "ab", np.nan, "nan,", "abc", "x nan , y", "x nan y"])
import re
literal_eval(re.sub(r'\bnan\s*,\s*', '', z))
輸出:['ab', '', 'abc', 'x y', 'x nan y']
uj5u.com熱心網友回復:
ast.literal_eval之所以建議eval這樣做,是因為它允許一組非常有限的陳述句。如檔案中所述:“安全地評估運算式節點或包含 Python 文字或容器顯示的字串。提供的字串或節點可能僅包含以下 Python 文字結構:字串、位元組、數字、元組、串列、字典、集合、布林值、無和省略號。” np.nan不是這些,因此無法評估。處理這個問題的選擇很少。
nan在對其進行評估之前通過對字串進行操作來洗掉。如果您想避免也從實際字串中洗掉 nan 可能會有問題。- 不建議 - 安全風險
eval-如果您在命名空間中定義 nan 變數,標準可以處理此問題 - 最后,我認為這是最好的選擇,但也是最難實作的:就像這里解釋的那樣,你獲取 的源代碼
ast,對其進行子類化并literal_eval以它知道如何自己處理nan字串的方式重新實作。
uj5u.com熱心網友回復:
關于什么:
eval(z,{'nan':'nan'}) # if you can tolerate then:
[i for i in eval(z,{'nan':'nan'}) if i != 'nan']
它可能有安全考慮。
uj5u.com熱心網友回復:
使用 filter() 函式:
list(filter(lambda f: type(f)==str, z))
uj5u.com熱心網友回復:
許多解決方案其中之一是
z = [nan, 'string', 'another_one']
string_list = []
for item in z :
# find the object come from str Class and Append it to the list
if item.__class__ == str:
string_list.append(item)
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/473929.html
上一篇:如何讓我的Android應用程式在每個顯示的文本行前加上“>”?
下一篇:將整數字串串列轉換為元組串列
