如何在Python中将列表转换为set时保持列表中元素的顺序,以及如何在Python中实现`scanf()`?
其实我有两个问题:如何在Python中将列表转换为set时保持列表中元素的顺序,以及如何在Python中实现`scanf()`?,python,python-3.x,Python,Python 3.x,其实我有两个问题: 转换为集合时,如何保持列表中元素的顺序? 例如,考虑以下内容: >集合([7,10,78,96,13,42,88,7,12,16]) {96,7,10,42,12,13,78,16,88} 订单在转换过程中丢失。如何维持秩序 当我们点击空格或输入而没有实际输入值时,如何在不出错的情况下获取输入 例如,如果代码如下:n=int(input())并且如果给定的输入只是,但下一行包含实际输入,那么如何等待直到获得有效输入 我的意思是,我希望像在C语言中那样。如果编写的代码类似于sc
>集合([7,10,78,96,13,42,88,7,12,16])
{96,7,10,42,12,13,78,16,88}
订单在转换过程中丢失。如何维持秩序
n=int(input())
并且如果给定的输入只是
,但下一行包含实际输入,那么如何等待直到获得有效输入
我的意思是,我希望像在C
语言中那样。如果编写的代码类似于scanf(“%d”,&n)
然后它将忽略所有空格并输入按键,并将获得实际输入。此外,还有另一个功能,如获取时间,如scanf(“%d:%d”,&h,&m)
实际上允许将:
作为分隔两个不同输入的输入
我尝试了两种不同的输入方式:
第一:
n=int(输入())
回溯(最近一次呼叫最后一次):
文件“”,第1行,在
n=int(输入())
ValueError:基数为10的int()的文本无效:“”
第二:
>>> 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'
来自sys import stdin的>>
>>>n=int(stdin.readline())
回溯(最近一次呼叫最后一次):
文件“”,第1行,在
n=int(stdin.readline())
ValueError:基数为10的int()的文本无效:'\n'
唯一明显的区别是
stdin
捕获返回键,而input()
仅将其捕获为空字符串。但它们都没有实现上述的scanf()
函数。如何实现这一点?为了保持顺序,您不能使用集
对象。但您可以使用冻结集
。冻结集只是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'字符串值和循环
>>> while 1:
try:
x = int(input().strip())
break
except ValueError:
pass
为了通过输入中的“:”字符分隔输入,只需使用string.split(“:”)
。它返回一个带分隔值的字符串
>>> a = "1:2:3"
>>> b = a.split(":")
>>> print(b)
['1', '2', '3']
希望这有帮助。为了保持顺序,您不能使用
集
对象。但您可以使用冻结集
。冻结集只是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'字符串值和循环
>>> while 1:
try:
x = int(input().strip())
break
except ValueError:
pass
为了通过输入中的“:”字符分隔输入,只需使用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]
集合没有顺序(或索引)。假设要将列表转换为集合以删除重复项(并将其转换回列表而不进行排序),请将列表转换为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]
如果转换没有重复项的列表,它将保留顺序。但是如果它有重复项,它会删除它们,所以请尝试
set(list(dict.fromkeys([1,2,3,1,5,6,2]))
对于第二个问题,不要首先将其转换为int
,如果值为”
,则继续输入,否则,将其转换为int如果您转换的列表没有重复项,它将保留顺序。但是如果它有重复项,它将删除它们,所以尝试set(list(dict.fromkeys([1,2,3,1,5,6,2]))
对于第二个问题,不要首先将其转换为int
,如果值为”
,则继续提供输入,如果值不是,则将其转换为int@AfiJaabb。我现在知道我在哪里犯了错误。在除
之外的部分中,第一部分再次添加了相同的行:x=int(input())
,假设它已经传递到下一行。再次感谢。非常感谢@AfiJaabb。我现在知道我在哪里犯了错误。在除
之外的部分中,第一部分再次添加了相同的行:x=int(input())
,假设它已经传递到下一行。再次感谢。