写入功能,检查列表是否具有相同的元素

时间:2015-10-30 14:06:47

标签: python

编辑:这是一个明确关于列表和功能的学习练习。因此,不允许将列表转换为集合。

我需要编写一个函数def sameSet(a,b)来检查两个列表是否按某种顺序具有相同的元素,忽略重复。例如,两个列表[1,4,9,16,9,7,4,9,11]和[11,11,7,9,16,4,1]将被视为相等。

这就是我的所作所为。我首先定义了一个辅助函数def contained(list1, list2),通过在列表1的元素位于列表2中时递增计数器来检查列表2中是否包含列表1.然后最后,如果计数器等于列表的长度1,我将布尔变量same设置为True,因为这意味着列表1中的每个元素也在列表2中。

    def main():
        list1 = [1, 4, 9, 16, 9, 7, 4, 9, 11, 11]
        list2 = [11, 11, 7, 9, 16, 4, 1]

    def sameSet(list1, list2):
        contained(list1, list2)
        contained(list2, list1)


    def contained(list1, list2):

        same = False
        count = 0

        for element in list1:
            if element in list2:
                count = count + 1
            else:
                count = count

        if count == len(list1):
            same = True

        return same

    main()

我不确定要为函数sameSet写什么。我希望它检查布尔变量same是否设置为True两个包含(即如果list1在list2中,如果list2在list1中,则意味着它们相等)。但我不知道如何在Python中实现它,以便程序正常工作。任何帮助将不胜感激。

5 个答案:

答案 0 :(得分:3)

将两个列表转换为集合,并比较集合

>>> list1 = [1, 4, 9, 16, 9, 7, 4, 9, 11] 
>>> list2 =  [11, 11, 7, 9, 16, 4, 1]
>>> set(list1) == set(list2)
True

答案 1 :(得分:1)

考虑新修改

要检查列表l1是否相等(从类似内容的方面)到列表l2而不使用set,您可以使用方便的内置{{3}功能。

您需要确保检查 较大 列表的值是否为全部,否则您将获胜真的得到你想要的东西。

作为一个小型演示:

l1 = [1, 2, 3, 4]
l2 = [1, 1, 2, 3, 4, 3, 2]

print(all(i in l1 for i in l2))  # True

l2.append(5)  # l2 = [1, 1, 2, 3, 4, 3, 2, 5]
print(all(i in l1 for i in l2))  # False

但如果您在执行l1后检查较小的列表l2的内容是否在较大的列表l2.append(5)中,则会出错,您会感到失望:< / p>

print(all(i in l2 for i in l1)) # Prints True :^)

为了使这成为一个功能 - 并且基本上重新发明了all()轮子 - 没有做任何'幻想',你可以做这样的事情:

def sameSet(a, b):
    # l1 is the large list, l2 the small list
    l1, l2 = (a, b) if len(a) > len(b) else (b, a)
    for val in l1:
        if val not in l2:
            return False
    return True 

同样的事情也是如此。

答案 2 :(得分:1)

如果不改变代码中的任何内容,我只需输入相同的函数:

<% @timetables.each do |timetable| %>
  <tr>
    <td><%= timetable.name %></td>
    <td><%= link_to "Download Resume", timetable.attachment_url %></td>
    <td><%= button_to "Delete",  timetable, method: :delete, class: "btn btn-danger", confirm: "Are you sure that you wish to delete #{timetable.name}?" %></td>
  </tr>
<% end %>

答案 3 :(得分:1)

我重构了你的代码,使它更加pythonic,并运行了几个测试...以及一些打印输出快速检查。

您的包含函数也适用于下面的SameSet函数,但效率不高。它有不必要的变量等...

def sameSet(list1, list2):
        if contained(list1, list2) and contained(list2, list1):
                print("the same!!")    
        else:
            print("not the same")


def contained(list1, list2):

    for element in list1:
        if element not in list2:
           return False

    return True

def main():
    # this prints "the same"
    sameSet([1, 4, 9, 16, 9, 7, 4, 9, 11, 11], [11, 11, 7, 9, 16, 4, 1])
    # this prints "not the same"
    sameSet([1, 4, 9, 16, 9, 7, 4, 9, 11, 11], [11, 11, 7, 9, 16, 4,12345])


if __name__=="__main__":
    main()

答案 4 :(得分:0)

使用dict和zip

def unq(l):
    return sorted(x for x in dict(zip(l,l)))

stat = unq(l1) == unq(l2)

所以构建每个列表的字典并对键列表进行排序,然后只比较2个结果,其中stat是布尔值(True或False)