我有一個串列,它有這樣的模式 [float, string, float string...] 但偶爾在模式中它會更改為 [float, string, float, string, string, float string...]。我想要做的是將串列的元素提取為 (float, name, NONETYPE 或 STRING) 格式的元組,以便稍后對其進行處理。這是一個小例子:
arr = [1150.1, 'James', 3323.1, 'Steve', 9323.1, 'John', 1233.1, 'Gary', 'criminal', 3293.1, 'Josh', 9232.1, 'Daniel', 'criminal']
我想提取串列,所以元組看起來像這樣:
(1150.1, James, NONE)
(3323.1, Steve, NONE)
(9323.1, John, NONE)
(1233.1, Gary, criminal)
(3293.1, Josh, NONE)
(9232.1, Daniel, criminal)
到目前為止,我已經嘗試檢查陣列中的下一個索引的型別,但它不起作用:
for index in range(len(arr)):
if type(arr[index]) == float and type(arr[index 1]) == str:
tup = arr[index], arr[index 1], None
print(tup)
elif type(arr[index]) == float and type(arr[index 1]) == str and type(arr[index 2]) == str:
tup = arr[index], arr[index 1], arr[index 2]
print(tup)
uj5u.com熱心網友回復:
您可以使用輔助串列跟蹤自上次浮動值以來您看到的陣列元素。每當看到浮點數時,將現有元素轉換為元組并清除輔助串列:
result = []
items = []
for item in arr:
if isinstance(item, float) and items:
if len(items) < 3:
items.append(None)
result.append(tuple(items))
items = [item]
else:
items.append(item)
result.append(tuple(items))
print(result)
這輸出:
[
(1150.1, 'James', None), (3323.1, 'Steve', None),
(9323.1, 'John', None), (1233.1, 'Gary', 'criminal'),
(3293.1, 'Josh', None), (9232.1, 'Daniel', 'criminal')
]
uj5u.com熱心網友回復:
您可以檢查“float”、“string”模式并相應地附加:
output = list()
for i, element in enumerate(arr):
if isinstance(element, float) and isinstance(arr[i 1], str):
if isinstance(arr[i 2], str):
t = tuple(arr[i:i 3])
else:
t = tuple(arr[i:i 2] ["NONE"])
output.append(t)
>>> output
[(1150.1, 'James', 'NONE'),
(3323.1, 'Steve', 'NONE'),
(9323.1, 'John', 'NONE'),
(1233.1, 'Gary', 'criminal'),
(3293.1, 'Josh', 'NONE'),
(9232.1, 'Daniel', 'criminal')]
uj5u.com熱心網友回復:
另一種解決方案:
from itertools import groupby
g1 = (g for v, g in groupby(arr, type) if v is float)
g2 = (g for v, g in groupby(arr, type) if v is str)
out = [(next(a), *[*b, None][:2]) for a, b in zip(g1, g2)]
print(out)
印刷:
[
(1150.1, "James", None),
(3323.1, "Steve", None),
(9323.1, "John", None),
(1233.1, "Gary", "criminal"),
(3293.1, "Josh", None),
(9232.1, "Daniel", "criminal"),
]
uj5u.com熱心網友回復:
也許你可以使用一個while回圈:
from typing import Optional, NamedTuple
class Element(NamedTuple):
value: float
name: str
profession: Optional[str] = None
def main() -> None:
arr = [
1150.1, 'James',
3323.1, 'Steve',
9323.1, 'John',
1233.1, 'Gary', 'criminal',
3293.1, 'Josh',
9232.1, 'Daniel', 'criminal',
]
parsed_elements = []
i = 0
while i <= len(arr) - 2:
if isinstance(arr[i 2], str):
parsed_elements.append(Element(*arr[i:i 3]))
i = 3
else:
parsed_elements.append(Element(*arr[i:i 2]))
i = 2
print('\n'.join(str(e) for e in parsed_elements))
if __name__ == '__main__':
main()
輸出:
Element(value=1150.1, name='James', profession=None)
Element(value=3323.1, name='Steve', profession=None)
Element(value=9323.1, name='John', profession=None)
Element(value=1233.1, name='Gary', profession='criminal')
Element(value=3293.1, name='Josh', profession=None)
Element(value=9232.1, name='Daniel', profession='criminal')
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/469384.html