编辑:这是一个明确关于列表和功能的学习练习。因此,不允许将列表转换为集合。
我需要编写一个函数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中实现它,以便程序正常工作。任何帮助将不胜感激。
答案 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)