簡體   English   中英

Python 列表推導根據字符串匹配修改元素

[英]Python list comprehension modify the elements based on string match

我有 python 代碼,它返回列表理解,如下面的返回代碼所示。

return [str(source.get(field)) for field in fields]
# one of the list output
['3', 'checkuser', '=checkuser', 'management', '', 'checkuser@gmail.com', '', 'True', "['apiusermanagement']", 'False']

要求

我需要檢查列表中的每個元素,如果元素的第一個字符以 ('=', '@', '|', '%') 這些字符中的任何一個開頭,那么我需要 append 中的單雙引號 (")該列表元素的開始。

例如,示例 output 中的第 3 個元素 '=checkuser' 以 '=' 開頭,因此該元素應修改為 '"=checkuser' 並且應該是返回列表 output 的一部分

# Expected output
['3', 'checkuser', '"=checkuser', 'management', '', 'checkuser@gmail.com', '', 'True', "['apiusermanagement']", 'False']

我是 Python 的初學者,並嘗試以最小的更改和良好的性能 output 來實現這一目標。 任何幫助或指針將不勝感激

一種選擇是將此邏輯放入 function 中:

def fetch_and_map(field):
    result = str(source.get(field))
    if result.startswith("="):
        return '"' + result
    else:
        return result

return [fetch_and_map(field) for field in fields]

你也可以這樣內聯:

return ['"' + str(source.get(field)) if str(source.get(field)).startswith("=") else str(source.get(field)) for field in fields]

請注意,如果source是字符串的字典,則可以通過跳過str()調用來簡化:

return ['"' + source.get(field) if source.get(field).startswith("=") else source.get(field) for field in fields]

您可以使用以下代碼:

output = ['3', 'checkuser', '=checkuser', 'management', '', 'checkuser@gmail.com', '', 'True', "['apiusermanagement']", 'False']
output_modified = []
for string in output:
    if string != "" and string[0] in ['=', '@', '|', '%']:
        output_modified.append('"' + string)
    else:
        output_modified.append(string)

這將遍歷output中的每個字符串。 如果字符串不為空且以'=''@''|'開頭 , 或'%' ,它將在string的開頭添加'"'並將 append 添加到output_modified 。如果沒有,它會簡單地將 append 原樣添加到output_modified

將列表放入變量中。 然后循環變量,在需要的地方添加雙引號。

result = [str(source.get(field)) for field in fields]
for i, val in enumerate(result):
    if len(val) > 0 and val[0] in ('=', '@', '|', '%'):
        result[i] = '"' + val
return result

像這樣的東西

lst = ['3', 'checkuser', '=checkuser', 'management', '', 'checkuser@gmail.com', '', 'True', "['apiusermanagement']",
       'False']
lst_ex = [f'"{x}' if x and x[0] in {'=', '@', '|', '%'} else x for x in lst]
print(lst_ex)

output

['3', 'checkuser', '"=checkuser', 'management', '', 'checkuser@gmail.com', '', 'True', "['apiusermanagement']", 'False']

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM