为什么str(list)
返回我们如何在控制台上看到列表?str(list)
工作如何?(是否有任何有关CPython代码的参考str(list)
)?
>>> x = ['abc', 'def', 'ghi']
>>> str(x)
"['abc', 'def', 'ghi']"
要从中获取原始列表,str(list)
我必须:
>>> from ast import literal_eval
>>> x = ['abc', 'def', 'ghi']
>>> str(x)
"['abc', 'def', 'ghi']"
>>> list(str(x))
['[', "'", 'a', 'b', 'c', "'", ',', ' ', "'", 'd', 'e', 'f', "'", ',', ' ', "'", 'g', 'h', 'i', "'", ']']
>>> literal_eval(str(x))
['abc', 'def', 'ghi']
为什么不list(str(list))
将其str(list)
转回原始列表?
或者我可以使用:
>>> eval(str(x))
['abc', 'def', 'ghi']
是literal_eval
一样的eval
吗?是否eval
安全使用?
我可以执行以下几次? 如果继续这样做,代码是否会中断str(list(str(list))))
?例如
>>> x = 'abc'
>>> list(x)
['a', 'b', 'c']
>>> str(list(x))
"['a', 'b', 'c']"
>>> list(str(list(x)))
['[', "'", 'a', "'", ',', ' ', "'", 'b', "'", ',', ' ', "'", 'c', "'", ']']
>>> str(list(str(list(x))))
'[\'[\', "\'", \'a\', "\'", \',\', \' \', "\'", \'b\', "\'", \',\', \' \', "\'", \'c\', "\'", \']\']'
>>> list(str(list(str(list(x)))))
['[', "'", '[', "'", ',', ' ', '"', "'", '"', ',', ' ', "'", 'a', "'", ',', ' ', '"', "'", '"', ',', ' ', "'", ',', "'", ',', ' ', "'", ' ', "'", ',', ' ', '"', "'", '"', ',', ' ', "'", 'b', "'", ',', ' ', '"', "'", '"', ',', ' ', "'", ',', "'", ',', ' ', "'", ' ', "'", ',', ' ', '"', "'", '"', ',', ' ', "'", 'c', "'", ',', ' ', '"', "'", '"', ',', ' ', "'", ']', "'", ']']
>>> str(list(str(list(str(list(x))))))
'[\'[\', "\'", \'[\', "\'", \',\', \' \', \'"\', "\'", \'"\', \',\', \' \', "\'", \'a\', "\'", \',\', \' \', \'"\', "\'", \'"\', \',\', \' \', "\'", \',\', "\'", \',\', \' \', "\'", \' \', "\'", \',\', \' \', \'"\', "\'", \'"\', \',\', \' \', "\'", \'b\', "\'", \',\', \' \', \'"\', "\'", \'"\', \',\', \' \', "\'", \',\', "\'", \',\', \' \', "\'", \' \', "\'", \',\', \' \', \'"\', "\'", \'"\', \',\', \' \', "\'", \'c\', "\'", \',\', \' \', \'"\', "\'", \'"\', \',\', \' \', "\'", \']\', "\'", \']\']'
>>> list(str(list(str(list(str(list(x)))))))
['[', "'", '[', "'", ',', ' ', '"', "'", '"', ',', ' ', "'", '[', "'", ',', ' ', '"', "'", '"', ',', ' ', "'", ',', "'", ',', ' ', "'", ' ', "'", ',', ' ', "'", '"', "'", ',', ' ', '"', "'", '"', ',', ' ', "'", '"', "'", ',', ' ', "'", ',', "'", ',', ' ', "'", ' ', "'", ',', ' ', '"', "'", '"', ',', ' ', "'", 'a', "'", ',', ' ', '"', "'", '"', ',', ' ', "'", ',', "'", ',', ' ', "'", ' ', "'", ',', ' ', "'", '"', "'", ',', ' ', '"', "'", '"', ',', ' ', "'", '"', "'", ',', ' ', "'", ',', "'", ',', ' ', "'", ' ', "'", ',', ' ', '"', "'", '"', ',', ' ', "'", ',', "'", ',', ' ', '"', "'", '"', ',', ' ', "'", ',', "'", ',', ' ', "'", ' ', "'", ',', ' ', '"', "'", '"', ',', ' ', "'", ' ', "'", ',', ' ', '"', "'", '"', ',', ' ', "'", ',', "'", ',', ' ', "'", ' ', "'", ',', ' ', "'", '"', "'", ',', ' ', '"', "'", '"', ',', ' ', "'", '"', "'", ',', ' ', "'", ',', "'", ',', ' ', "'", ' ', "'", ',', ' ', '"', "'", '"', ',', ' ', "'", 'b', "'", ',', ' ', '"', "'", '"', ',', ' ', "'", ',', "'", ',', ' ', "'", ' ', "'", ',', ' ', "'", '"', "'", ',', ' ', '"', "'", '"', ',', ' ', "'", '"', "'", ',', ' ', "'", ',', "'", ',', ' ', "'", ' ', "'", ',', ' ', '"', "'", '"', ',', ' ', "'", ',', "'", ',', ' ', '"', "'", '"', ',', ' ', "'", ',', "'", ',', ' ', "'", ' ', "'", ',', ' ', '"', "'", '"', ',', ' ', "'", ' ', "'", ',', ' ', '"', "'", '"', ',', ' ', "'", ',', "'", ',', ' ', "'", ' ', "'", ',', ' ', "'", '"', "'", ',', ' ', '"', "'", '"', ',', ' ', "'", '"', "'", ',', ' ', "'", ',', "'", ',', ' ', "'", ' ', "'", ',', ' ', '"', "'", '"', ',', ' ', "'", 'c', "'", ',', ' ', '"', "'", '"', ',', ' ', "'", ',', "'", ',', ' ', "'", ' ', "'", ',', ' ', "'", '"', "'", ',', ' ', '"', "'", '"', ',', ' ', "'", '"', "'", ',', ' ', "'", ',', "'", ',', ' ', "'", ' ', "'", ',', ' ', '"', "'", '"', ',', ' ', "'", ']', "'", ',', ' ', '"', "'", '"', ',', ' ', "'", ']', "'", ']']
好吧,您总共有4个问题,让我们一一解答。
1.为什么
str(list)
返回list
在控制台上看到的内容?str(list)
工作如何?
什么是str()
和__str__()
?
该str()
调用是返回一个 可打印的
仅为对象的形式!来自文档
str(object)
并不总是尝试返回可接受的字符串eval()
; 它的目标是返回可打印的字符串。
__str__()
每当您调用str()
对象时,都会调用类中的函数。再次从文档
object.__str__(self)
由
str()
内置函数和
list
可调用的是什么?该list()
调用是创建一个迭代器作为参数传递的列表。再次从文档
返回
list
其项目与iterable的项目相同且顺序相同的
因此,str(list)
为您提供了可打印的形式,list(str(list))
并将遍历字符串。这list(str(list))
将为您提供传递的参数的可打印形式的各个字符的列表。
嵌套调用之间的一小步漫游,
给定列表,l = ['a','b']
(为您举一个比您的问题小的示例的道歉)。
调用时str(l)
,它将返回列表的可打印形式l
,即"['a','b']"
。
现在您可以清楚地看到这"['a','b']"
是一个字符串,并且确实是 可迭代的
。现在,当您调用list
此方法时,即list("['a','b']")
会得到一个像这样的怪异列表['[', "'", 'a', "'", ',', "'", 'b', "'", ']']
。 为什么会这样? 发生这种情况是因为字符串会遍历其字符,您可以使用虚拟字符串进行测试,
>>> 'dummy'
'dummy'
>>> list('dummy')
['d', 'u', 'm', 'm', 'y']
因此,当您list
在字符串上调用时,会得到一个字符列表。请注意,再次在此处调用str()
时list('dummy')
,将不会取回原始字符串'dummy'
,因此必须再次使用join
!因此,调用相同的功能
不会 使您回到原来的对象!
那么,调用str()
列表会调用列表的内置__str__()
方法吗?
答案是不!
str()
清单时,内部会发生什么?每当您调用str()
列表对象时,遵循的步骤是
repr()
每个列表元素。[
在列表的前面添加一个花式]
,在列表的末尾添加另一个。
从
在hg.python中仔细阅读cpython的源代码,您会看到以下三个注释。(感谢Ashwini提供该特定代码上的链接)
github上cpython中的列表对象的源代码中可以看到。
/* Do repr() on each element. Note that this may mutate the list, so must refetch the list size on each iteration. */ line (382) /* Add "[]" decorations to the first and last items. */ line (398) /* Paste them all together with ", " between. */ line (418)
这些与我上面提到的要点相对应。
repr()
?repr()
打印所有对象的字符串表示形式。再次从文档
返回一个包含对象可打印表示形式的字符串。
还要注意这句话!
对于许多类型,此函数会尝试返回一个字符串,该字符串将在传递给时产生一个具有相同值的对象
eval()
,否则表示形式是一个用尖括号括起来的字符串,其中包含对象类型的名称以及其他信息通常包括对象的名称和地址。
现在你在这里的第二个问题,
2.为什么不
list(str(list))
将其str(list)
转回原始列表?
在内部,str(list)
实际上创建repr()
列表对象的表示形式。因此,在调用列表后要返回str
列表,您实际上需要执行eval
此操作而不是list
调用。
但是我们都知道那eval
是
邪恶的
,那么解决方法是什么?
literal_eval
第一个解决方法是使用ast.literal_eval
。这使我们想到了第三个问题,
3.
literal_eval()
与相同eval()
吗?是否eval()
安全使用?
ast.literal_eval()
与eval()
功能不同是安全的。文档本身提到它很安全-
安全地 评估表达式节点或包含Python文字或容器显示的字符串
另一个解决方法可以使用
str.split()
>>> x = ['abc', 'def', 'ghi']
>>> a = str(x)
>>> a[2:-2].split("', '")
['abc', 'def', 'ghi']
这只是对字符串列表执行此操作的一种简单方法。对于整数列表,您将需要map
。
>>> x = [1,2,3]
>>> a =str(x)
>>> list(map(int,a[1:-1].split(', '))) # No need for list call in Py2
[1, 2, 3]
因此,与literal_eval
这些不同的是,只要您知道列表的元素,这些都是简单的技巧。如果它们本质上是异类的,[1, "a", True]
那么您将不得不遍历拆分列表并发现元素类型,然后将其转换并将转换后的元素附加到最终列表中。
失败的另一个地方是字符串本身包含引号字符。正如nneonneo)在评论中提到的
该
str.split
解决方案非常脆弱,如果输入包含例如包含", "
,元组或其他列表的字符串,则该解决方案会中断。…最好使用ast.literal_eval
该解决方案,因为它将处理语法的所有细微问题。
对于您的最后一个问题,
4.如果
str(list(str(list))))
一次又一次执行代码是否会中断?
并不是的。每次您创建alist
的a
str
,然后再次获取其可打印版本时,输出将越来越长。该限制仅是您的物理计算机的限制。(将字符串长度乘以5后很快就会达到)。
list和str两种类型数据,有不少相似的地方,也有很大的区别。本讲对她们做个简要比较,同时也是对前面有关两者的知识复习一下,所谓“温故而知新”。 相同点 都属于序列类型的数据 所谓序列类型的数据,就是说它的每一个元素都可以通过指定一个编号,行话叫做“偏移量”的方式得到,而要想一次得到多个元素,可以使用切片。偏移量从0开始,总元素数减1结束。 例如: >>> welcome_str = "Welc
本文向大家介绍python中从str中提取元素到list以及将list转换为str的方法,包括了python中从str中提取元素到list以及将list转换为str的方法的使用技巧和注意事项,需要的朋友参考一下 在python中时常需要从字符串类型str中提取元素到一个数组list中,例如str是一个逗号隔开的姓名名单,需要将每个名字提取到一个元素为str型的list中。 如姓名列表str = '
本文向大家介绍python中(str,list,tuple)基础知识汇总,包括了python中(str,list,tuple)基础知识汇总的使用技巧和注意事项,需要的朋友参考一下 python是一门动态解释型的强类型定义语言(先编译后解释) 动态类型语言 动态类型的语言编程时,永远也不用给任何变量指定数据类型,该语言会在你第一次赋值给变量时,在内部将数据类型记录下来 解释型 程序每执行到源程序的某
本文向大家介绍Python hexstring-list-str之间的转换方法,包括了Python hexstring-list-str之间的转换方法的使用技巧和注意事项,需要的朋友参考一下 在Python操作数据内容时,多数情况下可能遇到下面3种类型的数据处理: hexstring 如:'1C532145697A8B6F' str 如:'\x1C\x53\x21\x45\x69\x7A\x8B\
问题内容: 我创建了以下方法: 它非常简单,并且在用户区域设置中返回世界国家/地区的列表。然后,我对其进行排序以使其按字母顺序排列。这一切都很好(除了我似乎偶尔会得到国家的重复!)。 无论如何,无论如何,我需要将美国和英国放在列表的顶部。我的问题是我无法隔离将为美国和英国返回的索引或字符串,因为这是特定于语言环境的! 任何想法将不胜感激。 问题答案: 您还可以使用来消除重复项,并使用自己来消除US
所以我知道如何创建映射值列表