当我试图得到一个非唯一的列表时,我不知怎的得到了一个空列表

2024-05-17 04:05:09 发布

您现在位置:Python中文网/ 问答频道 /正文

我自学python,当我试图解决《代码帝国》中的一个问题时,有一个问题我不知怎么搞不清楚是什么问题。你知道吗

问题:

def non_unique(data):
    return data

if __name__ == "__main__":
    assert isinstance(non_unique([1]), list), "The result must be a list"
    assert non_unique([1, 2, 3, 1, 3]) == [1, 3, 1, 3], "1st example"
    assert non_unique([1, 2, 3, 4, 5]) == [], "2nd example"
    assert non_unique([5, 5, 5, 5, 5]) == [5, 5, 5, 5, 5], "3rd example"
    assert non_unique([10, 9, 10, 10, 9, 8]) == [10, 9, 10, 10, 9], "4th example"

我的解决方案:

def non_unique(data):
    a = data
    for i in data:
        if data.count(i) == 1:
            b = [data.remove(i)]
            print(i)
            if b == [None]:
                b = []
        else:
            b = a
    return b

问题:有些单子我可以得到正确的结果,但有些单子我不知怎么得到了空单子,这真的让我困惑


Tags: 代码namedatareturnifmainexampledef
3条回答

获取所需内容的一种不是很有效的方法(我推断是一个列表,其中只包含data中的重复对象):

def non_unique(data):
    return [d for d in data if data.count(d) > 1]

代码无法工作的原因是data.remove(i)总是返回None,因此if b == [None]条件总是True,因此b总是设置为空列表。另外,对于data中的项的每次迭代,您将重新分配b的值,因此您的返回值将仅是bfor循环中分配给b的上一个值。如果data中的最后一项实际上是重复的,它应该返回正确的答案,但是如果最后一项不是重复的,它将始终返回一个空列表。你知道吗

我就是这么做的:

def non_unique(data):
    temp = [sub[0] for sub in [(item, data.count(item)) for item in set(data)] if sub[1] > 1]
    return [i for i in data if i in temp]

说明:

[(item, data.count(item)) for item in set(data)]: 将数据转换为一个集合,以获取唯一的值并计算每个值的出现次数。它返回一个元组,在索引-1位置包含计数。你知道吗

[sub[0] for sub in [..] if sub[1] > 1]: 对于计数大于1的所有项,从内部列表中包含的元组中获取项索引-0。你知道吗

[i for i in data if i in temp]: 最后,要保持原始列表的顺序,请遍历它并保留以前提取的所有内容。你知道吗


注意

此解决方案比简单地执行[d for d in data if data.count(d) > 1]更有效,因为此变体多次获得每个重复的count。你知道吗


断言:

assert isinstance(non_unique([1]), list), "The result must be a list"
assert non_unique([1, 2, 3, 1, 3]) == [1, 3, 1, 3], "1st example"
assert non_unique([1, 2, 3, 4, 5]) == [], "2nd example"
assert non_unique([5, 5, 5, 5, 5]) == [5, 5, 5, 5, 5], "3rd example"
assert non_unique([10, 9, 10, 10, 9, 8]) == [10, 9, 10, 10, 9], "4th example"

它们都不升高AssertionError

你需要重新思考如何构建你的解决方案。.removelist方法删除列表中第一个出现的值。你知道吗

>>> a = [1,3,4]
>>> a.remove(1)
>>> a
[3, 4]

它将始终返回None,或者在尝试删除不存在的值时引发错误。你知道吗

您的函数将返回奇怪的东西,因为它返回b,有时是a(反过来是data,也被.remove突变),有时是从b = []行返回一个空列表。你知道吗

我建议设置如下内容:(在伪代码中):

answer = []
for value in data:
    if data has only one occurrence of value:
        add value to the answer list

return answer

这是一个很好的例子,在这种情况下,您应该构建一组新的数据,而不是从原始数据中删除。(即建立一个新的列表并返回该列表,而不是改变原始数据)。你知道吗

编辑:构建一个新的(过滤的)数据集的想法是其他答案中给出的列表理解技术背后的想法。你知道吗

相关问题 更多 >