我正在嘗試將所有數字添加到 Python 語言中的字串中。例如,
s="""11 9 5
6 6 8
4 6 4"""
如果我們將該字串分為 3 行,并且每行用“Enter”分隔,并且它們之間有一些空格,我們怎么能輸出:21,21,17 (11 6 4 = 21) 或 (9 6 6) =21) 或 (5 8 4=17)。你能幫我完成嗎?
uj5u.com熱心網友回復:
您可以使用zip進行這樣的垂直操作。并映射用于評估串列中所有元素的sum函式:
s="""11 9 5
6 6 8
4 6 4"""
print(list(map(sum, zip(*[map(int, i.strip().split()) for i in s.split("\n")]))))
# [21, 21, 17]
解釋:老實說,單線性代碼總是難以閱讀且不可維護:) 讓我們將代碼分解為這些部分以便更好地理解:
list_with_string_numbers = [i.strip().split() for i in s.split("\n")]
# returns => [['11', '9', '5'], ['6', '6', '8'], ['4', '6', '4']]
map_all_str_elements_to_int = [map(int, i.strip().split()) for i in s.split("\n")]
# returns => [<map object at 0x7f991725f6a0>, <map object at 0x7f991725f730>, <map object at 0x7f9917b293a0>]
join_vertically = list(zip(*[map(int, i.strip().split()) for i in s.split("\n")]))
# returns [(11, 6, 4), (9, 6, 6), (5, 8, 4)]
最后 sum 對串列中的所有元組進行聚合。
list(map(sum, zip(*[map(int, i.strip().split()) for i in s.split("\n")])))
# [21, 21, 17]
uj5u.com熱心網友回復:
這不是一行,但它是可讀的
v = list(map(int, s.split()))
# col_size = int(len(v)**0.5)
col_size = len(s.split("\n")[0].split())
res = [0]*col_size
for i in range(0, len(v)):
res[i%col_size] = v[i]
uj5u.com熱心網友回復:
考慮到可能存在長度不等的情況,例如這種情況。
"""
1 2 3
2 3
3 4 5
"""
因此,基于@Mojtaba Kamyabi的回答,我做了修改,替換功能zip用itertools.zip_longest。
創建一個迭代器,聚合來自每個可迭代物件的元素。如果可迭代的長度不均勻,則用 fillvalue 填充缺失值。迭代一直持續到最長的可迭代物件用完為止。
from itertools import zip_longest
s="""1 2 3
2 3
3 4 5"""
print(list(map(sum, zip_longest(*[map(int, i.strip().split()) for i in s.split("\n")], fillvalue=0))))
# [6, 9, 8]
uj5u.com熱心網友回復:
這是一種單行方法:
s = """11 9 5 6 6 8 4 6 4"""
out = ','.join(map(str, map(sum, zip(*zip(*[iter(map(int, s.split()))]*3)))))
print(out) # 21,21,17
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/407628.html
標籤:
上一篇:沒有正則運算式的有效用戶名
下一篇:為什么我輸入字串的功能不起作用?
