2

Pythonには、2つのリストAB. どちらのリストもタプルで構成されています(x,y)。例えば:

A = [('x1','y1'), ('x2','y2'), ('x3','y3')]
B = [('x1','y1'), ('x2','y5'), ('x4','y4')]

今、私が欲しい結果は3つあります。タプルが含まれていなければ、それらはすべて集合論で簡単に解くことができます。

結果 1: 両方のリストの交差: set(A) & set(B))。したがって、結果は両方のリストのタプルの両方の値を比較する必要があります。結果は次のようになります。C = [('x1','y1')]

(x,y)[0]結果 2: のみが一致する両方のリストの交差。結果は次のようになります: D = (('x1','y1'), ('x2', ('y2', 'y5'))]。理想的には解決策ですD - C -> E = [('x2', ('y2', 'y5'))]が、私はそれ自体で生きることができDます.

結果 3: :Bと比較したリストの固有値。でのみ比較されます。結果は次のようになります: 。Aset(B)-(set(A) & set(B))(x,y)[0][('x4', 'y4')]

これらの問題については何も見つけることができず、自分で解決策を構築することもできませんでした. 誰でも助けることができますか?

4

3 に答える 3

1
  1. 両方のリストの交点:

    あなたはすでに解決策を知っています: set(A) & set(B). または、同等に、set(A).intersection(B).

    >>> A = [('x1', 'y1'), ('x2', 'y2'), ('x3', 'y3')]
    >>> B = [('x1', 'y1'), ('x2', 'y5'), ('x4', 'y4')]
    >>> set(A).intersection(B)
    {('x1', 'y1')}
    
  2. (x,y)[0] のみが一致する両方のリストの交差:

    まず、 と の両方が x 座標でソートされていることを確認しAますB

    次にitertools.groupby()と辞書を使用します:

    >>> a_grouped = {x: list(points) for x, points in
    ...              itertools.groupby(A, lambda point: point[0])}
    >>> b_grouped = {x: list(points) for x, points in
    ...              itertools.groupby(B, lambda point: point[0])}
    >>> [(x, {point[1] for point in a_grouped[x] + b_grouped[x]})
    ...  for x in a_grouped if x in b_grouped]
    [('x2', {'y5', 'y2'}), ('x1', {'y1'})]
    

    (これはあなたが尋ねたものとまったく同じではありません。なぜなら、ご覧 のとおり、('x1', {'y1'})代わりに を持っているから('x1', 'y1')です。また、リストの代わりにセットを持っていますが、これらはどちらも簡単に修正できるものです。)

    共通点を除外したい場合: groupby() を呼び出す直前にそれらAを削除します。B

    >>> A = set(A)
    >>> B = set(B)
    >>> common_points = A & B
    >>> A = [point for point in A if point not in common_points]
    >>> B = [point for point in B if point not in common_points]
    
  3. Bと比較したlist の固有値A、 のみで比較(x,y)[0]:

    の点のすべての x 座標のセットを作成しAます。

    >>> exclude = {point[0] for point in A}
    >>> [point for point in B if point[0] not in exclude]
    [('x4', 'y4')]
    

    excludeの要素は のキーであることに注意してくださいa_grouped-- これは、前の問題のコードの一部を再利用して、次のように記述できることを意味します。

    >>> [point for point in B if point[0] not in a_grouped]
    [('x4', 'y4')]
    

これらすべてのソリューションについて、パフォーマンスと可読性の両方を向上させることができます。私のコードを使用する場合は、これを考慮してください。

于 2015-09-02T11:56:53.827 に答える