【问题标题】:Unpacking tuples within a list of lists with specific order在具有特定顺序的列表列表中解包元组
【发布时间】:2018-06-19 13:43:10
【问题描述】:

我有一长串清单。每个列表中的第一项是一个包含四个字符串的元组。一些列表有第二个项目,它是一个字符串:

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

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

【问题讨论】:

  • 要转换为整数的字符串总是在同一个位置吗?或者你需要找到它?
  • 整数总是在同一个位置

标签: python python-3.x list tuples


【解决方案1】:
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']

【讨论】:

  • 非常感谢!这正是我所需要的。您知道在线页面可以帮助我了解 unpack() 中的星号是如何工作的吗?我不熟悉符号。
  • @JackReimer Here's one of the PEPs that descibe the unary * operator。另一个用途是在函数定义中:def foo(**bar): print(bar) 接受任意数量的bar 参数并将它们放在一个元组中。所以foo(1, 2, 3) 会打印(1, 2, 3)
【解决方案2】:

我从你的解释中了解到:

  • 元组的第二个元素始终是整数
  • 元组总是有 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 的列表中不起作用。

【讨论】:

    猜你喜欢
    • 2017-07-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-04
    • 1970-01-01
    • 2020-09-07
    • 1970-01-01
    相关资源
    最近更新 更多