簡體   English   中英

從列表列表中識別唯一值,每個列表至少有 n 個唯一元素

[英]Identify unique values from list of lists, with each list having at least n unique elements

我有一份清單

measurements = [[1,2,3],[1,3,5,6],[4,6,7,8]]

我需要相對於其他列表從每個列表中檢索 N 個唯一元素。 假設 N = 2。結果必須是

result = [[1,2],[5,6],[7,8]]

當然可以有其他組合,但我只需要一個這樣的組合。 有沒有辦法得到這個?

如果你想要獨特的元素,集合是要走的路。 要從列表列表中獲取唯一值,請嘗試以下操作:

>>> measurements = [[1,2,3],[1,3,5,6],[4,6,7,8]]
>>> result = set(x for l in measurements for x in l)
>>> result
{1, 2, 3, 4, 5, 6, 7, 8}

或者

>>> from itertools import chain
>>> measurements = [[1,2,3],[1,3,5,6],[4,6,7,8]]
>>> print(set(chain(*measurements)))
{1, 2, 3, 4, 5, 6, 7, 8}
import random
measurements = [[1,2,3],[1,3,5,6],[4,6,7,8]]
result = []
N = 2
for x in measurements:
    result.append(random.sample(x,N)

print(result)

您可以先將列表列表轉換為集合列表,然后通過使用functools.reduce對其他集合執行set.difference來查找每個集合中的唯一元素:

from functools import reduce
measurements = [[1,2,3],[1,3,5,6],[4,6,7,8]]
sets = list(map(set, measurements))
diffs = [reduce(set.difference, sets[:i] + sets[i+1:], sets[i]) for i in range(len(sets))]

diffs將變為:

[{2}, {5}, {8, 4, 7}]

然后從diffs列表中的每個集合中獲取N項目將是微不足道的:

result = []
for diff in diffs:
    result.append([])
    for _ in range(2): # assuming N = 2
        try:
            result[-1].append(diff.pop())
        except KeyError:
            pass

result會變成:

[[2], [5], [8, 4]]

請注意,您問題中的預期輸出[[1,2],[5,6],[7,8]]是不正確的,因為16都不是唯一的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM