2011-12-24 45 views
7

列表解析非常好。但某种“......加入......”将会非常有用。谢谢。例如, 。我有一个集合A = {1,0},一个列表B = [[1,1],[2,3]]。我想找到B中的所有行,其中第二个colomu是A中的一个值。或者更通用的一些,我有2个CSV文件。我想找出两个文件中一些殖民地的值匹配的所有行。就像两种文件的“连接”一样。其中一个文件是GB大小。 sqldf is "SQL select on R data frames."Python中是否有一个模块为R执行类似“sqldf”的操作?

+3

你会得到更多/更好的答案,如果你有一个简短的总结“sqldf”为非R用户所做的事情。您想要的功能究竟是哪些部分? – 2011-12-24 22:40:07

+1

同意...另外,一些代码或至少一些伪代码来解释你正在尝试做什么会有所帮助。 – 2011-12-24 22:42:27

回答

4

,我不知道一个图书馆的做你的要求(但我只在sqldf文档瞥了一眼),但是没有什么的,你问什么真正需要的库,他们的俏皮话在Python(和你可以当然抽象创建功能的功能而不是简单的列表理解...)

设置A = {1,0},列表B = [[1,1],[2,3]] 。我想找到B中的所有行第二列是值中的一个A.

>>> a = set([1, 0]) 
>>> b = [[1,1],[2,3]] 
>>> [l for l in b if l[1] in a] 
[[1, 1]] 

我有2个的CSV文件。我想找出两个文件中某列的值匹配的所有行。

>>> f1 = [[1, 2, 3], [4, 5, 6]] 
>>> f2 = [[0, 2, 8], [7, 7, 7]] 
>>> [tuple_ for tuple_ in zip(f1, f2) if tuple_[0][1] == tuple_[1][1]] 
[([1, 2, 3], [0, 2, 8])] 

编辑:如果内存使用是一个问题,你应该使用发电机,而不是名单。例如:

>>> zip(f1, f2) 
[([1, 2, 3], [0, 2, 8]), ([4, 5, 6], [7, 7, 7])] 

但使用发电机:

>>> import itertools as it 
>>> gen = it.izip(f1, f2) 
>>> gen 
<itertools.izip object at 0x1f24ab8> 
>>> next(gen) 
([1, 2, 3], [0, 2, 8]) 
>>> next(gen) 
([4, 5, 6], [7, 7, 7]) 

并为数据源:

>>> [line for line in f1] 
[[1, 2, 3], [4, 5, 6]] 

转化为发电机为:

>>> gen = (line for line in f1) 
>>> gen 
<generator object <genexpr> at 0x1f159b0> 
>>> next(gen) 
[1, 2, 3] 
>>> next(gen) 
[4, 5, 6] 
+0

谢谢@mac。你是对的,如果你没有处理一次无法在内存中读取的大文件,则列表理解与SQL类似。如果我对大型CSV文件做同样的事情,我会很高兴。 – gstar2002 2011-12-25 00:02:59

+0

@ gstar2002 - 没有什么能阻止你使用这个语法来生成发生器而不是列表。查看修改。 – mac 2011-12-25 00:13:34

+0

谢谢,它适用于izip。但对于f1中的([l1,l2]中的l1,f2中的l2),它不起作用。我只把f1的第一行与f2的所有行结合在一起。但我想拥有所有组合。 – gstar2002 2011-12-25 00:58:55

相关问题