簡體   English   中英

遍歷Python列表,保留嵌入式列表的結構

[英]Iterate over Python list, preserving structure of embedded lists

Python新手在這里。 我正在嘗試在包含各種長度列表的列表上執行基本功能。 這些列表中的元組包含我打算用作范圍的成對元素。 我想將這些元素轉換成整數,然后用整數創建一個新的元組,然后是2 ,它將代表迭代器。

我想l

l = [[('100', '200'), ('300', '400'), ('500', '600')], [('100', '200')], [('100', '200')]]

l_upd代替

l_upd = [[(100, 200, 2), (300, 400, 2), (500, 600, 2)], [(100, 200, 2)], [(100, 200, 2)]]

這顯然行不通(而且我不知道如何將2作為元素放置:

l1 = []
l2 = []

for pairs in l:
    for pair in pairs:
        l1.append(int(i[0]))
        l2.append(int(i[1]))

l_upd = zip(l1, l2)

編輯:我寧願不使用列表推導方法,因為我需要包括一個ifelse語句。 有些元素包含字母,有些則為空。

這些異常需要以下內容:

for pair in pairs:
    if pair[0].isdigit():
        addr_from.append(int(i[0]))
    elif pair[0].isalnum() is True and pair[0].isdigit is False:
        addr_from.append(re.sub(r'((?:[A-Z].*?)?(?:\d.*?)?[A-Z]+)(\d+)',r'\1%\2',pair[0]))
    else:
        addr_from.append(pair[0])
    if pair[1].isdigit():
        addr_to.append(int(i[1]) + 2)
    elif pair[1].isalnum() is True and pair[1].isdigit is False:
        addr_to.append(re.sub(r'((?:[A-Z].*?)?(?:\d.*?)?[A-Z]+)(\d+)',r'\1%\2',pair[1]))

您可以編寫一些遞歸函數來完成這項工作(這意味着該函數可以處理任何級別的嵌套列表,除非達到最大遞歸深度)

def addtwo(lst):
   new_lst = []
   for item in lst:
     if isinstance(item, list):
       new_lst.append(addtwo(item))
     elif isinstance(item, tuple):
       new_lst.append(item + (2,))

   return new_lst

l = [[('100', '200'), ('300', '400'), ('500', '600')], [('100', '200')], [('100', '200')]]
print addtwo(l)

#[[('100', '200', 2), ('300', '400', 2), ('500', '600', 2)], [('100', '200', 2)], [('100', '200', 2)]]

使用列表推導:

>>> [[tuple(map(int, pair)) + (2,) for pair in pairs] for pairs in l]
[[(100, 200, 2), (300, 400, 2), (500, 600, 2)], [(100, 200, 2)], [(100, 200, 2)]]

還是沒有地圖:

>>> [[(int(a), int(b), 2) for a, b in pairs] for pairs in l]
[[(100, 200, 2), (300, 400, 2), (500, 600, 2)], [(100, 200, 2)], [(100, 200, 2)]]

編輯

即使進行了進一步的檢查,您仍然可以使用列表理解。 我假設您添加到問題中的if / else部分應該應用於每對,結果元組應該是(addr_from, addr_to, 2) ,對吧?

def processPair(a, b):
    if a.isdigit():
        a = int(a)
    elif a.isalnum():
        a = re.sub(r'((?:[A-Z].*?)?(?:\d.*?)?[A-Z]+)(\d+)', r'\1%\2', a)
    if b.isdigit():
        b = int(b) + 2
    elif b.isalnum():
        b = re.sub(r'((?:[A-Z].*?)?(?:\d.*?)?[A-Z]+)(\d+)', r'\1%\2', b)
    return (a, b, 2)

在這里,我定義了一個函數,可以像在問題中一樣處理元組(a, b) 請注意,我已經對其進行了更改,僅修改變量的值並返回一個完成的元組(添加了2),而不是將其附加到某些全局列表中。

我也簡化了一點。 a.isdigit() is Truea.isdigit()相同,因為它已經返回了布爾值。 a.isdigit() == False相同,與not a.isdigit()相同。 在這種情況下,您也可以刪除多余的支票。 檢查后a.isdigit()if ,你不需要去檢查它的反面elif ; 由於您之前已經檢查過,因此保證它為假。

話雖這么說,當您說完函數時,然后可以再次使用列表推導來獲取輸出。 當然,對於您的示例l ,這有點無聊:

>>> [[processPair(*pair) for pair in pairs] for pairs in l]
[[(100, 202, 2), (300, 402, 2), (500, 602, 2)], [(100, 202, 2)], [(100, 202, 2)]]

暫無
暫無

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

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