1

我已经四处寻找有关此问题的指示,但找不到任何指示。假设我在 Python 中有一个列表:

list = set([((3, 2), (2, 1)),
            ((3, 2), (3, 1)),
            ((3, 1), (2, 1)), 
            ((2, 1), (1,3), (2, 3))])

我想改进这个列表,以便包含具有相同第一个元素的对的列表条目被丢弃。例如,上面列表的输出应该是

set([((3, 2), (2, 1)),
     ((3, 1), (2, 1))])

因为((3, 2), (3, 1))((2, 1), (1,3), (2, 3))是其中至少两个坐标对具有相同第一个条目的元素。有没有一种快速简便的方法来做到这一点?

就目前而言,我正在考虑做类似的事情

[x for x in list if ... ]

我通过修复x[k][0]并遍历列表并将每个x[i][0]与变化i的进行比较x[k][0],然后遍历所有这些k。我觉得必须有更好的方法来做到这一点。希望我在这个问题上足够清楚,非常感谢您的帮助。

4

3 回答 3

3

你可以使用

def throw_out_elements(iterable):
    for x in iterable:
       if len(set(y for y, _ in x)) == len(x):
            yield x

然后使用这个:

S = set([((3, 2), (2, 1)),
            ((3, 2), (3, 1)),
            ((3, 1), (2, 1)), 
            ((2, 1), (1,3), (2, 3))])
print list(throw_out_elements(S))

output: [((3, 2), (2, 1)), ((3, 1), (2, 1))]
于 2012-12-26T20:53:17.983 回答
3

这可以通过一个简单的集合理解和一个​​简单的函数很容易地完成:

def no_duplicates(x):
    seen = set()
    return not any(i in seen or seen.add(i) for i in x)

data = {((3, 2), (2, 1)),
        ((3, 2), (3, 1)),
        ((3, 1), (2, 1)),
        ((2, 1), (1,3), (2, 3))}

print({item for item in data if no_duplicates(first for first, _ in item)})

生产:

{((3, 2), (2, 1)), 
 ((3, 1), (2, 1))}

如果项目中每对的第一个元素是唯一的,我们将获取每个项目。我们使用简单的no_duplicates()函数(从这个很好的答案中提取)来做到这一点,它会按照它在锡上所说的那样做。

于 2012-12-26T20:55:01.470 回答
1

如果您对单个列表理解死心塌地,则以下内容将起作用。

my_list = set([((3, 2), (2, 1)),
        ((3, 2), (3, 1)),
        ((3, 1), (2, 1)),
        ((2, 1), (1,3), (2, 3))])

[x for x in my_list if len(set([y[0] for y in x])) == len(x)]

编辑:第一个答案是错误的,因为我误读了这个问题。

于 2012-12-26T20:58:32.657 回答