我有一个输入文件,其中包含年份和等级,如下所示:
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
...
答案 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")
在做什么。
我们将year
和rating
变量分配给[literal_eval(x) for ...]
的元素。因此,此列表的第一个和第二个元素将分配给它们。在列表文字中,我们拆分原始行,然后使用literal_eval
将生成的列表的每个元素转换为本地python类型。因此,在此之后,int
中有一个year
,而float
中有一个rating
。