编写将在列表中添加唯一字符的代码

时间:2018-12-14 14:22:24

标签: python

所以下面的代码应该讨论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'))

2 个答案:

答案 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))]