当我试图获得一个非唯一列表时,我会以某种方式得到一个空列表

时间:2017-06-09 11:17:32

标签: python list

我自学python,当我试图解决“帝国的代码”中的一个问题时,有一个问题我无法弄清楚问题是什么。< / p>

问题:

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

问题:有些列表我可以得到正确的结果,但其他一些我以某种方式获得空列表,这真的让我很困惑

3 个答案:

答案 0 :(得分:0)

我就是这样做的:

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)]: 数据将转换为一组以获取唯一值,并计算每个值的出现次数。它返回一个元组,它在 index-1 位置包含计数。

[sub[0] for sub in [..] if sub[1] > 1]: 对于所有具有计数&gt;的项目1从内部列表中包含的元组中获取项目 index-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

的情况下运行

答案 1 :(得分:0)

获得所需内容的一种非常有效的方法(我推断的是一个只包含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的值,因此您的返回值将只是 last 值{{1} }被分配到b循环中。如果for中的最终项目实际上是重复项,则它应该返回正确的答案,但如果最终项目不是重复项,则它将始终返回空列表。

答案 2 :(得分:0)

您需要重新思考如何构建解决方案。 b list方法删除列表中第一次出现的值。

a

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

你的函数将返回奇怪的东西,因为它返回data,有时.remove(反过来是b = [],它也会被{{1}变异}}),有时是answer = [] for value in data: if data has only one occurrence of value: add value to the answer list return answer 行的空列表。

我建议设置类似的东西:(在伪代码中):

src

这是一个很好的案例,您应该构建一组新数据,而不是从原始数据中删除。 (即建立一个新的列表并返回而不是改变原始数据)。

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