按特定顺序在列表列表中解开元组

时间:2018-06-19 13:43:10

标签: python python-3.x list tuples

我的名单很长。每个列表中的第一项是具有四个字符串的元组。其中一些列表还有第二个项目,它是一个字符串:

list_one = [('string1', 'number', 'Longstring1', 'long_string2'), 'long_string3']
list_two = [('string5', 'number1', 'Longstring4', 'long_string5')]  

我想遍历每个列表,以使数字字符串最好在列表的开头转换为整数,而元组中的其余项是它们自己的列表项。如果无法将数字字符串转换为可以的整数,只要它们位于列表的第一位即可。因此希望它看起来像这样:

new_list_one = [number, 'string1', 'Longstring1', 'long_string2', 'long_string3']
new_list_two = [number, 'string5', 'Longstring4', 'long_string5']  

如何才能按照特定顺序解开元组?使用数字作为关键字的字典对我来说最简单吗?到目前为止,我的主要问题是区分在元组之外具有最终字符串的列表的过程。

2 个答案:

答案 0 :(得分:2)

list_one = [('string1', '100', 'Longstring1', 'long_string2'), 'long_string3']
list_two = [('string5', '200', 'Longstring4', 'long_string5')] 

您可以打开元组的包装,切换第一个和第二个元素,然后尝试转换为和int

def int_if_possible(val):
    try:
        return int(val)
    except ValueError:
        return val

def unpack(l):
    ret = [*l[0], *l[1:]]
    ret[0], ret[1] = int_if_possible(ret[1]), ret[0]
    return ret

print(unpack(list_one))
# [100, 'string1', 'Longstring1', 'long_string2', 'long_string3']
print(unpack(list_two))
# [200, 'string5', 'Longstring4', 'long_string5']

答案 1 :(得分:0)

据您了解,解释:

  • 元组的第二个元素始终是整数
  • 元组始终包含4个元素
  • 列表有时只包含一个元素

如果这些是固定规则,那么您可以明确而简单。

def trans(lst):
    ret = [int(lst[0][1]), lst[0][0], lst[0][2], lst[0][3]]
    if len(lst) == 2:
        ret.append(lst[1])
    return ret

不好。*运算符在Python 2.7的列表中不起作用。