Python-在执行多重赋值时对元组的某些元素进行操作?

Python-在执行多重赋值时对元组的某些元素进行操作?,python,Python,做这样的事情, s = "12:00 PM" hours, s = s.split(':') hours = int(hours) 在赋值之前,是否有一个优雅的单行习惯用法来对元组的第一个元素执行类型转换 这里有一个选择,但它不是音速的 hours, s = (int(w) if w.isdigit() else w for w in s.split(':')) 您可以使用提取小时数 >>> from datetime import datetime >>>

做这样的事情,

s = "12:00 PM"
hours, s = s.split(':')
hours = int(hours)
在赋值之前,是否有一个优雅的单行习惯用法来对元组的第一个元素执行类型转换

这里有一个选择,但它不是音速的

hours, s = (int(w) if w.isdigit() else w for w in s.split(':'))
您可以使用提取小时数

>>> from datetime import datetime
>>> datetime.strptime('12:00 PM', '%H:%M %p').hour
12
你可以做:

>>> s = "12:00 PM"
>>> hour, the_rest=[(int(x),y) for x,y in [s.split(':')]][0]
>>> hour
12
如果两次查找同一个角色都不违法,您还可以执行以下操作:

>>> hour, the_rest=int(s[0:s.find(':')]), s[s.find(':')+1:]

您可以尝试制作一些优雅的函数来完成此操作。下面是一个例子:

from itertools import zip_longest

def cast(*items):
    """
    Usage:
        cast('some', '123')(str, int) -> ['some', 123]
    """
    def to_type(*types):
        return [t(i) if t is not None else i 
                for i, t in zip_longest(items, types)]
    return to_type


s = "12:00 PM"
hours, _ = cast(*s.split(':'))(int)

print(hours, type(hours))  # 12 <class 'int'>
从itertools导入zip\u
def cast(*项):
"""
用法:
cast('some','123')(str,int)->['some',123]
"""
def至_类型(*类型):
如果t不是其他i,则返回[t(i)]
对于i,t in-zip_最长(项目、类型)]
返回到_类型
s=“下午12:00”
小时数,ux=cast(*s.split(“:”)(int)
打印(小时,键入(小时))#12

您可以从内嵌lambda函数返回元组,并调用它:

hours, rest = (lambda t: (int(t[0]),t[1]))(s.split(':'))

你的方法已经可以了。如果您不需要其他物品:

hours = int(s.split(":", 1)[0])
注意:
.split()
返回一个列表,而不是元组

您可以使用切片来提取前缀:

hours = int(s[:s.index(":")])

可以将一个对象绑定到一个新名称,并在同一行中使用该名称,但这对于脑筋急转弯者来说最有用:

t = a, *b = t[int(a)] = "0:rest".split(":")

int(s.split(“:”[0])——像这样吗?这是一个有趣的问题。我不认为有什么好的习惯用法,但我会继续思考。或者你的意思是,同时保留元组赋值的后半部分?正如你可能从所有答案中看出的那样,不,没有优雅的单行习惯用法。干净的方法正是您在第一个代码块的问题中提供的方法。这已经被问了很多次,答案是否定的。