如何在Python中将列表转换为set时保持列表中元素的顺序,以及如何在Python中实现`scanf()`?

2024-09-21 07:49:37 发布

您现在位置:Python中文网/ 问答频道 /正文

其实我有两个问题:

  1. 转换为集合时,如何保持列表中元素的顺序? 例如,考虑以下内容:

>>>set([7, 10, 78, 96, 13, 42, 88, 7, 12, 16])

{96, 7, 10, 42, 12, 13, 78, 16, 88}

订单在转换过程中丢失。如何维持秩序

  1. 当我们点击空格或输入而没有实际输入值时,如何在不出错的情况下获取输入

例如,如果代码类似:n = int(input()),并且如果给定的输入只是<Enter>,但下一行包含实际输入,那么如何等待直到获得有效输入

我的意思是,我想用{}语言来表达。如果您像scanf("%d",&n);那样编写代码,那么它将忽略所有空格并输入按键,并将获得实际输入。另外,还有另一个特性,比如获取类似scanf("%d:%d", &h, &m);的时间,它实际上允许:作为一个输入来分隔两个不同的输入

我尝试了两种不同的输入方式: 第一:

>>>n = int(input())

Traceback (most recent call last):
  File "<pyshell#13>", line 1, in <module>
    n = int(input())
ValueError: invalid literal for int() with base 10: ''

第二:

>>> from sys import stdin
>>> n = int(stdin.readline())

Traceback (most recent call last):
  File "<pyshell#12>", line 1, in <module>
    n = int(stdin.readline())
ValueError: invalid literal for int() with base 10: '\n'

唯一明显的区别是stdin捕获返回键,而input()仅将其捕获为空字符串。但是它们都没有实现上面解释的scanf()函数。如何实现这一点


Tags: 代码inmostinputstdinlinecallfile
2条回答

为了保持顺序,不能使用set对象,但可以使用frozenset。冻结集只是Python集对象的不可变版本。 就是这样,

>>> a = [1,2,3,4,5]
>>> b = frozenset(a)
>>> print(a)
[1, 2, 3, 4, 5]
>>> print(b)
frozenset({1, 2, 3, 4, 5})

对于您的第二个问题,我建议使用此代码。在给定整数之前,它不会从循环中断

>>> while 1:
    try:
        x = int(input().strip())
        break
    except ValueError:
        pass

string.strip()用于删除python字符串中的所有前导和尾随空格。不过,在没有string.strip()的情况下,它仍然可以工作。 但在给定整数之前,它不会考虑任何'\n'字符串值和循环

为了用“:”字符分隔输入,您可以简单地使用string.split(":")。它返回一个带分隔值的字符串

>>> a = "1:2:3"
>>> b = a.split(":")
>>> print(b)
['1', '2', '3']

希望这有帮助

集合没有顺序(或索引)。假设要将列表转换为集合以删除重复项(并将其转换回列表而不进行排序),请将列表转换为NumPy数组以删除重复项

>>> l = [2, 5, 10, 6, 3, 10, 5, 7]
>>> l = np.array(l)    
>>> unique_index = np.unique(l, return_index = True)[-1]
>>> unique_l = [l[i] for i in sorted(unique_index)]
>>> unique_l
[2, 5, 10, 6, 3, 7]

相关问题 更多 >

    热门问题