我一直在寻找关于这个问题的指针,但找不到任何指针。假设我有一个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
}的。我觉得必须有更好的方法来做到这一点。希望我在这个问题上足够清楚,我非常感谢你的帮助。
答案 0 :(得分: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))]
答案 1 :(得分:3)
使用简单的set comprehension和简单的函数可以轻松完成此操作:
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()
函数(从this great answer中提取)来执行此操作,这样做就像在锡上所做的那样。
答案 2 :(得分: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)]
编辑:第一个回答错了,因为我误解了这个问题。