3

我有以下两个列表

l1 = {{{2011, 3, 13}, 1}, {{2011, 3, 14}, 1}, {{2011, 3, 15},
    1}, {{2011, 3, 16}, 2}, {{2011, 3, 17}, 3}};
l2 = {{{2011, 3, 13}, 40}, {{2011, 3, 16}, 50}, {{2011, 3, 17}, 60}};

我需要从 l2 中提取日期(每个 l2 元素的第一个元素)与 l1 中的日期匹配的项目(以便生成两个长度完全相同的列表)

我不明白为什么会这样:

选择[l1, MemberQ[转置[l2][[1]], #[[1]]]]

应该产生一个空列表。我错过了一些微不足道的事情吗?

4

5 回答 5

7

你忘记了和号。它应该是

Select[l1, MemberQ[Transpose[l2][[1]], #[[1]]]&]
于 2011-04-20T22:17:43.993 回答
4

Sjoerd 向您展示了如何使您的方法发挥作用,但这并不是最佳的。问题是Transpose[l2][[1]]l1. David 给出了一个只执行一次该步骤的方法。您还可以使用:

Cases[l1, {Alternatives @@ l2[[All, 1]], _}]
于 2011-04-20T22:50:17.897 回答
3

当您的列表变大时,一种更快的方法:

DeleteCases[GatherBy[Join[l1, l2], First], {_}][[All, 1]]

(*  Out= {{{2011, 3, 13}, 40}, {{2011, 3, 16}, 50}, {{2011, 3, 17}, 60}}  *)

如果您的列表可能包含重复项,您可以使用

l1 = GatherBy[l1, First][[All, 1]]

首先删除重复项。

于 2011-04-21T04:07:43.300 回答
2

这可能是你的想法吗?

dates=Transpose[l2][[1]];
Cases[l1, {x_, _} /; MemberQ[dates, x]]
于 2011-04-20T22:10:28.340 回答
1

这是我的非排序交集代码:

NonSortingIntersection[l1_, l2_, test_: SameQ] := 
 Module[{res = 
    Last@Reap[
      Scan[Extract[l1, 
         Position[l1, x_ /; test[x, #], {1}, 1, Heads -> False], 
         Sow] &, l2]]}, If[res === {}, res, First[res]]]

这是用法:

In[22]:= NonSortingIntersection[l1, l2, 
 Function[{x, y}, First[x] == First[y]]]

Out[22]= {{{2011, 3, 13}, 1}, {{2011, 3, 16}, 2}, {{2011, 3, 17}, 3}}

请注意,与其他解决方案不同,保证输出的长度不再是l2. 例如:

In[24]:= Cases[Join[l1, l1], {x_, _} /; MemberQ[Evaluate[Transpose[l2][[1]]], x]]

Out[24]= {{{2011, 3, 13}, 1}, {{2011, 3, 16}, 2}, {{2011, 3, 17}, 
  3}, {{2011, 3, 13}, 1}, {{2011, 3, 16}, 2}, {{2011, 3, 17}, 3}}

In[25]:= NonSortingIntersection[Join[l1, l1], l2, 
 Function[{x, y}, First[x] == First[y]]]

Out[25]= {{{2011, 3, 13}, 1}, {{2011, 3, 16}, 2}, {{2011, 3, 17}, 3}}

这可能是可取的,也可能不是可取的,但这取决于更了解他的问题的radhat。

于 2011-04-21T01:03:12.357 回答