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

时间:2016-02-27 00:34:20

标签: python

做这样的事,

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

是否有一个优雅的单行习惯用法在赋值之前对元组的第一个元素执行类型转换?

这是一个选项,但它相当unpythonic

hours, s = (int(w) if w.isdigit() else w for w in s.split(':'))

5 个答案:

答案 0 :(得分:1)

你可以这样做:

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

答案 1 :(得分:1)

您可以从内联lambda函数返回一个元组,并将其命名为:

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

答案 2 :(得分:1)

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

hours = int(s.split(":", 1)[0])

注意:.split()返回一个列表,而不是元组。

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

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

可以将一个对象绑定到一个新名称,并在同一行上使用该名称,但它最常用于脑筋急转弯:

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

答案 3 :(得分:0)

您可以使用date time.strptime提取小时

from tkinter import *
from tkinter import ttk

class App(Frame):
    def __init__(self, master):
        ttk.Frame.__init__(self, master, padding='20')
        self.grid(column=0, row=0, sticky=(N, W, E, S))
        self.create_button()

    def create_button(self):
        self.button = ttk.Button(self,
                                 text="Click",
                                 width=12,
                                 command=lambda: self.display_name_and_picture()
                                 ).grid(column=2, columnspan=2, row=1, sticky=NW)

    def display_name_and_picture(self):
        random_label = ttk.Label(self, font=(None, 16), text='random random')
        random_label.grid(row=0, column=5, sticky=N)

        random_image = PhotoImage(file='random.gif')
        label = Label(image=random_image)
        label.image = random_image
        label.grid(row=1, column=5, sticky=NW)

root = Tk()
root.title("Random something...")
root.geometry("600x300")
app = App(root)
root.mainloop()

答案 4 :(得分:-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'>