迭代Python列表,保留嵌入列表的结构

时间:2013-03-14 00:11:13

标签: python list

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]))

2 个答案:

答案 0 :(得分:3)

你可以编写一些递归函数来完成这项工作(这意味着该函数可以处理任何级别的嵌套列表,除非它达到最大递归深度)

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)]]

答案 1 :(得分:3)

使用列表推导:

>>> [[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)]]