在Python中从一行解析多个变量类型

时间:2018-10-11 09:25:44

标签: python python-3.x

我有一个输入文件,其中包含年份和等级,如下所示:

select event,from_unixtime(unix_timestamp(date_in_ist,'yyyy-mm-dd'),
                    'MM-yyyy') as 'Month-Year',count(*) as count_users
from tablename
where eveent in ('app_opened','app install','app_access','app launched')
group by event,from_unixtime(unix_timestamp(date_in_ist,'yyyy-mm-dd'),
                    'MM-yyyy')

年份需要作为整数处理,而评级则需要像浮点数那样处理。

我想知道是否有比我目前正在做的单行/更多pythonic方式读取行:

1997    4.2
2004    1.2
1908    3.6
...

3 个答案:

答案 0 :(得分:1)

您可以使用lambda将其写在一行中:

for line in sys.stdin:
    year, rating = (lambda x: (int(x[0]), float(x[1])))(line.split())

但是恕我直言,它比您的2行解决方案难读,因此不确定它是否更 pythonic ...

如果数据是制表符或空格分隔的,也许可以使用csv模块...

答案 1 :(得分:0)

尝试使用map()函数:

with open('data.txt', 'r') as f:
    s = f.read()    
l = list(map(lambda x: (int(x[0]),float(x[1])),[i.split('\t') for i in s.split('\n')]))

示例输入:

1997    4.2
2004    1.2
1908    3.6

示例输出:

[(1997, 4.2), (2004, 1.2), (1908, 3.6)]

答案 2 :(得分:0)

您可以通过多种方法来执行此操作,而其他答案似乎是正确的,但是我认为还有一种更简单的方法。

直到您确定每一行都有以下模式:int\tfloat,您可以使用literal_eval将嵌入式类型转换为字符串,以转换为本地python类型。 这是您的简单代码:

from ast import literal_eval

for line in sys.stdin:
    year, rating = [literal_eval(x) for x in line.strip().split("\t")]

此代码非常简单。如您所使用的,那么您知道line.strip().split("\t")在做什么。

我们将yearrating变量分配给[literal_eval(x) for ...]的元素。因此,此列表的第一个和第二个元素将分配给它们。在列表文字中,我们拆分原始行,然后使用literal_eval将生成的列表的每个元素转换为本地python类型。因此,在此之后,int中有一个year,而float中有一个rating