所以下面的代码应该讨论msg中的唯一字符和唯一字符,并创建一个包含两个子列表的列表。一个例子是
crack_the_code('hello there', 'abccd eabfb')
应该返回
[['h', 'e', 'l', 'o', 't', 'r'], ['a', 'b', 'c', 'd', 'e', 'f']].
我在下面尝试做的事情是创建三个列表,然后运行一个for循环来检查我是否在新列表中(唯一)(如果未将其添加到列表中),对unique_code进行了同样的操作。
然后最终将两个列表放在一起并返回,但是当我打印时我什么也没有。任何帮助,将不胜感激。
def crack_the_code(msg, code):
unique = []
unique_code = []
cracked = []
for i in msg:
if i not in unique:
unique.extend(i)
for item in code:
if item not in unique_code:
unique_code.extend(item)
cracked = unique.append(unique_code)
return cracked
print(crack_the_code('hello there', 'abcd eabfb'))
答案 0 :(得分:2)
用append交换扩展名,并用extension交换附加项。我认为您在功能方面让他们感到困惑。
您将元素添加到列表。 您将一个列表扩展到另一个列表。
此外,您在第二个for循环中使用了[item],但您将[i]添加到了列表中。将其更改为[item],然后下面的代码将起作用:
def crack_the_code(msg, code):
unique = []
unique_code = []
cracked = []
for i in msg:
if i not in unique:
unique.append(i)
for item in code:
if item not in unique_code:
unique_code.append(item)
cracked = unique + unique_code
return cracked
print(crack_the_code('hello there', 'abcd eabfb'))
答案 1 :(得分:2)
您将得到None
,因为unique.append(unique_code)
突变了unique
并且没有返回修改后的列表,而是返回了None
(因为所有对输入进行突变的函数)。您可以改为使用return [unique, unique_code]
。
在确定收益后,您应该使用更好的算法。每当您检查if i not in unique
时,都会线性检查列表unique
中的值i
,使其总计为O(n^2)
。
这使用的是itertools
recipe unique_everseen
,它保持原始顺序并且是O(n)
,因为它使用set
来跟踪已经看到的字母:
from itertools import filterfalse
def unique_everseen(iterable):
"List unique elements, preserving order. Remember all elements ever seen."
# unique_everseen('AAAABBBCCDAABBB') --> A B C D
seen = set()
seen_add = seen.add
for element in filterfalse(seen.__contains__, iterable):
seen_add(element)
yield element
def crack_the_code(msg, code):
return [list(unique_everseen(msg)), list(unique_everseen(code))]
如果您不能使用itertools
,也可以自己编写(可能稍慢一些):
def unique_everseen(iterable):
"List unique elements, preserving order. Remember all elements ever seen."
# unique_everseen('AAAABBBCCDAABBB') --> A B C D
seen = set()
seen_add = seen.add
for element in iterable:
if element not in seen:
seen_add(element)
yield element
如果您不关心订单,只需使用set
:
def crack_the_code(msg, code):
return [list(set(msg)), list(set(code))]