我自学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
问题:有些列表我可以得到正确的结果,但其他一些我以某种方式获得空列表,这真的让我很困惑
答案 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
这是一个很好的案例,您应该构建一组新数据,而不是从原始数据中删除。 (即建立一个新的列表并返回而不是改变原始数据)。
编辑:构建一个新的(已过滤的)数据集的想法是这里其他答案中给出的列表理解技术背后的想法。