【问题标题】:How to add() runtime input in a set in python?如何在 python 的集合中添加()运行时输入?
【发布时间】:2019-07-16 10:23:27
【问题描述】:

问题

我正在尝试使用 for 循环在运行时 add() 集合中的元素:

    l1=set(map(int, input().split()))
    n=int(input())
    l2=set()
    for i in range(n):
        l2.add([int, input().split()])
    print(l1)
    print(l2)

令人惊讶的是,l1 是一个集合,但是当我在循环中继续 add() -ing 元素到我的集合 l2 时,我得到:

TypeError: unhashable type: 'list'

研究工作:

以下是我尝试将add() 元素设置为l2 并失败的其他方法:

l2=set()
for i in range(n):
    l2.add(map(int, input().split()))

上面打印出来:

{<map object at 0x000001D5E88F36A0>, <map object at 0x000001D5E8C74AC8>}

即使这样也行不通!!

for i in range(n):
    l2.add(set(map(int, input().split())))

请随时指出我做错了什么。

基本上,如果可以解释如何添加,答案将很有帮助 在运行时循环将元素添加到集合数据结构中

澄清:

我正在寻找在运行时使用用户输入制作一组集合:

所以如果用户给出以下输入:

1 2 3 4 5 6 7 8 9 10 11 12 23 45 84 78
2
1 2 3 4 5
100 11 12

第一行是我的集合l1。第二行是集合的数量,所以既然是2,那么后面的行就是集合的内容。

预期输出:

{{1,2,3,4,5},{100,11,12}}

【问题讨论】:

  • 试试(int, tuple(input.split()))。可变对象没有哈希码(因为它们在变异时会发生变化,并且会破坏哈希集合的工作方式)。 set 是使用哈希表实现的,因此它只能存储不可变的内容(或至少:身份不可变的内容)。 lists 是可变的,因此没有哈希码。 split 也返回一个列表。
  • 好的,让我检查并恢复。
  • 我得到:AttributeError: 'function' object has no attribute 'split'
  • 对不起input().split() 缺少的括号是一个错字
  • 我写了 l2.add((int, tuple( input.split())))

标签: python python-3.x set


【解决方案1】:

由于set.add 只接受单个元素,而不是可迭代元素,因此您可以遍历map 并单独添加每个元素

l2 = set()
for i in range(n):
    for element in map(int, input().split()):
    l2.add(element)

在我看来,这不像将map 变成set 那样优雅,就像您对l1 所做的那样,并将其添加到现有集合中:

l2 = set()
for i in range(n):
    l2 |= set(map(int, input().split()))

您可以使用set.update 来避免将map 显式转换为set

l2 = set()
for i in range(n):
    l2.update(map(int, input().split()))

事实上,update 可以接受任意数量的迭代,因此您可以(但可能不应该)为更新编写单行代码:

l2 = set()
l2.update(*[map(int, input().split()) for i in range(n)])

【讨论】:

  • 您的方法效果很好。但我一直在寻找的是,如果我能把它做成一组。
  • 就像在 l2 中附加 n 个带有运行时输入的集合。 { {....} , {...}, {....},....{...}}
  • 我尝试了您的编辑,但仍然无法将其视为一组集合。请随时解决您的困惑,我愿意为您提供帮助。
  • @mishx。在问题的每个部分显示预期输出。
  • 我已经添加了预期的输出
【解决方案2】:

由于我现在回答的是一个本质上不同的问题,所以我发布了第二个答案。

set 是可变的,因此不可散列。可变对象可以实现哈希函数,但内置对象通常不会避免问题。不要使用set,而是为嵌套集使用可散列的frozenset

l2 = set()
for i in range(n):
    l2.add(frozenset(map(int, input().split())))

l2 = {frozenset(map(int, input().split())) for i in range(n)}

l2 = set(frozenset(map(int, input().split())) for i in range(n))

您将无法修改 l2 的子集,但它们将作为集用于其他目的。

【讨论】:

  • 我正在尝试。一秒通知你
  • 我对 freezeset() 不太熟悉,但我的输出显示为 - {frozenset({1, 2, 3, 4, 5}), frozenset({11, 100, 12}) }
  • 看起来每个元素都不一样,是一个集合。但不知道为什么会写上frozenset这个词
  • @mishsx。因为当你打印一个内置容器时,它会打印带有repr 的元素。 frozensetrepr 是一个字符串,可以让您构造对象,因此包含单词 frozenset
【解决方案3】:

希望这对您有所帮助。

l1=set(map(int, input('Enter first set: ').split()))
print(l1)
n=int(input('Enter n: '))
l2=set()
for i in range(n):
    l2 = l2 | set(map(int, input(f'Enter {i+2}rd set: ').split()))

print(l2)
# {1,2,3,4,5,100,11,12}
  • 在 python 中你不能有一组列表

  • 使用合并运算符而不是添加

  • {{1,2,3,4,5},{100,11,12}} 表达式在数学上和编程上都是错误的。

  • 数学上的集合是集合的交集。

  • 您可以有集合列表,但没有集合。所以l2 应该是列表而不是设置。这是制作集合列表的代码。

    l1 = set(map(int, input('Enter first set: ').split()))
    print(l1)
    n = int(input('Enter n: '))
    l2 = list()
    for i in range(n):
        l2.append(set(set(map(int, input(f'Enter {i + 2}rd set: ').split()))))
    
    print(l2)
    
    # [{1,2,3,4,5},{100,11,12}]
    

【讨论】:

  • 我现在试试,然后告诉你
  • 我很欣赏你的解决方案,但它给了我一个集合,其中包含我在输入中给出的集合的合并元素。我在我的帖子中附上了一个澄清。请随时解决您仍有任何疑问。
  • 蓝色 你是正确的关于不合逻辑和数学错误的部分,使一组集合。但是使用 freezeset() 我能够做到。我很欣赏你优雅的解决方案,并且会参考同样的解决方案,因为我总是会遇到一个案例来制作一组列表。
【解决方案4】:
inn = input("enter the number of elements in set")
set1 = set()
for i in range(int(inn)):
    print (i)
    in1 = input("enterset elements:")
    set1.add(in1)
print (set1)

【讨论】:

  • 希望这是在运行时构建的非常简单的设置
猜你喜欢
  • 1970-01-01
  • 2012-04-04
  • 1970-01-01
  • 2012-07-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-09-03
相关资源
最近更新 更多