我自学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
问题:有些单子我可以得到正确的结果,但有些单子我不知怎么得到了空单子,这真的让我困惑
获取所需内容的一种不是很有效的方法(我推断是一个列表,其中只包含
data
中的重复对象):代码无法工作的原因是
data.remove(i)
总是返回None
,因此if b == [None]
条件总是True
,因此b
总是设置为空列表。另外,对于data
中的项的每次迭代,您将重新分配b
的值,因此您的返回值将仅是b
在for
循环中分配给b
的上一个值。如果data
中的最后一项实际上是重复的,它应该返回正确的答案,但是如果最后一项不是重复的,它将始终返回一个空列表。你知道吗我就是这么做的:
说明:
[(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
。你知道吗断言:
它们都不升高
AssertionError
你需要重新思考如何构建你的解决方案。
.remove
list方法删除列表中第一个出现的值。你知道吗它将始终返回None,或者在尝试删除不存在的值时引发错误。你知道吗
您的函数将返回奇怪的东西,因为它返回
b
,有时是a
(反过来是data
,也被.remove
突变),有时是从b = []
行返回一个空列表。你知道吗我建议设置如下内容:(在伪代码中):
这是一个很好的例子,在这种情况下,您应该构建一组新的数据,而不是从原始数据中删除。(即建立一个新的列表并返回该列表,而不是改变原始数据)。你知道吗
编辑:构建一个新的(过滤的)数据集的想法是其他答案中给出的列表理解技术背后的想法。你知道吗
相关问题 更多 >
编程相关推荐