Python 中字符串、列表、元组、集合及字典之间的相互转换

Python 中包含几种基本的数据类型:
​
列表(list): 是长度可变有序的数据存储容器,可以通过下标索引取到相应的数据。
元组(tuple): 固定长度不可变的顺序容器,访问效率高,适合存储一些常量数据,可以作为字典的键使用。
集合(set): 无序,元素只出现一次,可以自动去重。
字典(dict): 长度可变的 hash 字典容器。存储的方式为键值对,可以通过相应的键获取相应的值,key 支持多种类型。key 必须是不可变类型且唯一。
​

这些数据类型之间都可以通过不同的方法进行相互转换:

1.字符串转换为其他数据类型

# 字符串转列表
str1 = 'abc'
print(list(str1))  # ['a', 'b', 'c']
# 切分字符串
str2 = 'a b c'
print(str2.split())  # ['a', 'b', 'c']
# 字符串转元组
print(tuple(str1))  # ('a', 'b', 'c')
# 字符串转集合
print(set(str1))   # {'a', 'c', 'b'}
# 字符串转字典
str2 = "{'a': 97, 'b': 98}"
print(eval(str2))  # {'a': 97, 'b': 98}
​

2.列表转换为其他数据类型

# 列表转字符串
list1 = ['a', 'b', 'c']
print(''.join(list1))  # abc   以指定字符分隔字符串
print(str(list1))   # "['a', 'b', 'c']"
# 列表转元组
list1 = [1, 2, 3]
print(tuple(list1))  # (1, 2, 3)
# 列表转集合(去重)
list1 = [1, 2, 2, 3]
print(set(list1))  # {1, 2, 3}
# 两个列表转字典
list1 = ['key1', 'key2', 'key3']
list2 = ['value1', 'value2', 'value3']
print(dict(zip(list1, list2)))  # {'key1': 'value1', 'key2': 'value2', 'key3': 'value3'}
# 嵌套列表转字典
list1 = [['key1', 'value1'], ['key2', 'value2']]
list2 = [('key1', 'value1'), ('key2', 'value2')]
print(dict(list1))  # {'key1': 'value1', 'key2': 'value2'}
print(dict(list2))  # {'key1': 'value1', 'key2': 'value2'}
​

3.元组转换为其他数据类型

# 元组转字符串
tuple1 = ('a', 'b', 'c')
print(''.join(tuple1))   # 'abc'
# 元组转列表
tuple1 = (4, 5, 6)
print(list(tuple1))  # [4, 5, 6]
# 元组转集合
print(set(tuple1))  # {4, 5, 6}
# 两个元组转字典
tuple1 = ('a', 'b')
tuple2 = (97, 98)
print(dict(zip(tuple1, tuple2)))  # {'a': 97, 'b': 98}
# 嵌套元组转字典
tuple3 = (('a', 97), ('b', 98))
print(dict(tuple3))  # {'a': 97, 'b': 98}
​

4.集合转换为其他数据类型

# 集合转字符串
set1 = {'a', 'b', 'c', 'd'}
print(''.join(set1))  # 'abcd'
# 集合转列表
set1 = {7, 8, 9}
print(list(set1))  # [8, 9, 7]
# 集合转元组
print(tuple(set1))  # (8, 9, 7)
# 两个集合转字典
set1 = {'a', 'b'}
set2 = {97, 98}
print(dict(zip(set1, set2)))  # {'a': '97', 'b': 98}
# 集合转字典
set3 = {('a', '97'), ('b', 98)}
print(dict(set3))  # {'a': '97', 'b': 98}

5.字典转换为其他数据类型

# 字典转字符串
dict1 = {'a': 97, 'b': 98}
print(str(dict1))  # "{'a': 97, 'b': 98}"
# 字典转列表
dict1 = {'a': 97, 'b': 98}
print(list(dict1.items()))  # [('a', 97), ('b', 98)]
# 字典转元组
print(tuple(dict1.items()))  # (('a', 97), ('b', 98))
# 字典转集合
print(set(dict1.items()))  # {('b', 98), ('a', 97)}
 

6.字典键值对的相互转换

# 键值对的交换(键唯一)
# 字典推导式(常用)
dict1 = {'a': 1, 'b': 2}
dict_new = {value: key for key, value in dict1.items()}
print(dict_new)  # {1: 'a', 2: 'b'}
​
dict1 = {'a': 1, 'b': 2}
dict_new = {}
for key, val in dict1.items():
    dict_new[val] = key
print(dict_new)  # {1: 'a', 2: 'b'}
​
dict1 = {'a': 1, 'b': 2}
dict_new = dict([val, key] for key, val in dict1.items())
print(dict_new)  # {1: 'a', 2: 'b'}
​
dict1 = {'a': 1, 'b': 2}
dict_new = dict(zip(dict1.values(), dict1.keys()))  # zip()
print(dict_new)  # {1: 'a', 2: 'b'}
​

扩展

字符串--列表

字符串转列表

  • 1.使用内置函数 list()

>>> str1 = "abcdefg"
>>> list1 = list(str1)
>>> print(list1)
['a', 'b', 'c', 'd', 'e', 'f', 'g']
>>>
  • 2.使用内置函数 eval()

>>> str2 = "['aaa', 'bbb', 'ccc', 'ddd']"
>>> list2 = eval(str2)
>>> print(type(list2))
<class 'list'>
>>> print(list2)
['aaa', 'bbb', 'ccc', 'ddd']
>>>
  • 3.使用内置模块 json.loads() 方法

# str3 = "['aaa', 'bbb', 'ccc', 'ddd']" 
# 因为 json.loads() 是将json格式字符串转换为python对象,而按 json 的标准规范应该使用双引号,如果使用单引号会导致报错
>>> str3 = '["aaa", "bbb", "ccc", "ddd"]'
>>> import json
>>> list3 = json.loads(str3)
>>> print(type(list3))
<class 'list'>
>>> print(list3)
['aaa', 'bbb', 'ccc', 'ddd']
>>>
  • 4.使用 split() 进行分割

>>> str4 = "username=admin&passsword=123456"
>>> list4 = str4.split("&")
>>> print(type(list4))
<class 'list'>
>>> print(list4)
['username=admin', 'passsword=123456']
>>>

如果我们要对多个字符进行分割,那么可以使用内置模块 re.split() 方法。

>>> str5 = "username=admin&passsword=123456"
>>> import re
>>> list5 = re.split("&|=", str5)
>>> print(type(list5))
<class 'list'>
>>> print(list5)
['username', 'admin', 'passsword', '123456']
>>>

列表转字符串

  • 1.使用内置函数 str()

# 注意,转换之后,双引号会变为单引号
>>> list1 = ["aaa", 123, 'ccc', True]
>>> str1 = str(list1)
>>> print(type(str1))
<class 'str'>
>>> print(str1)
['aaa', 123, 'ccc', True]
>>>

上面直接使用 str(),是将整个列表转换为字符串,如果我们不想改变列表的类型,只是要将列表中所有元素转为字符串,那么可以借助列表推导式来实现。

# 注意,转换之后,双引号会变为单引号
>>> list1 = ["aaa", 123, 'ccc', True]
>>> str2 = [str(i) for i in list2]
>>> print(type(str2))
<class 'list'>
>>> print(str2)
['aaa', '123', 'ccc', 'True']
>>>
  • 2.使用 join() 进行拼接

>>> list3 = ['username=admin', 'passsword=123456']
>>> str3 = "&".join(list3)
>>> print(type(str3))
<class 'str'>
>>> print(str3)
username=admin&passsword=123456
>>>
  • 3.使用内置模块 json.dumps() 方法

# 这里列表中使用了单引号
>>> list4 = ['username=admin', 'passsword=123456']
>>> import json
>>> str4 = json.dumps(list4)
>>> print(type(str4))
<class 'str'>
>>> print(str4)
["username=admin", "passsword=123456"]
>>>

需要注意的是,按 json 的标准规范是使用双引号 "",因此在转换之后得到的json字符串是双引号的。

字符串--字典

字符串转字典

  • 1.使用内置函数 eval()

>>> str1 = "{'username':'admin', 'password':123456}"
>>> dict1 = eval(str1)
>>> print(type(dict1))
<class 'dict'>
>>> print(dict1)
{'username': 'admin', 'password': 123456}
>>>
  • 2.使用内置模块 json.loads() 方法

# str1 = "{'username':'admin', 'password':123456}"
# 因为 json.loads() 是将json格式字符串转换为python对象,而按 json 的标准规范应该使用双引号,如果使用单引号会导致报错
>>> str2 = '{"username":"admin", "password":123456}'
>>> import json
>>> dict2 = json.loads(str2)
>>> print(type(dict2))
<class 'dict'>
>>> print(dict2)
{'username': 'admin', 'password': 123456}
>>>
  • 3.使用内置模块 ast.literal_eval() 方法

>>> str3 = "{'username':'admin', 'password':123456}"
>>> import ast
>>> dict3 = ast.literal_eval(str3)
>>> print(type(dict3))
<class 'dict'>
>>> print(dict3)
{'username': 'admin', 'password': 123456}
>>>

我们发现,Python中已经有了内置函数 eval(),但现在却又出现个类似的 ast.literal_eval() 方法,二者的区别是什么呢?

这里主要是出于安全性的考虑,因为 ast.literal_eval() 会判断计算后的结果是不是合法的python类型,如果是则进行运算,否则就不进行运算,而 eval() 则不会管这些,即使字符串是一个命令,它也会进行解析。

因此,相比 eval() 函数, ast.literal_eval() 更加安全,更被 推荐使用

字典转字符串

  • 1.使用内置函数 str()

>>> dict1 = {'username': 'admin', 'password': 123456}
>>> str1 = str(dict1)
>>> print(type(str1))
<class 'str'>
>>> print(str1)
{'username': 'admin', 'password': 123456}
>>>
  • 2.使用内置模块 json.dumps() 方法

>>> dict2 = {'username': 'admin', 'password': 123456}
>>> import json
>>> str2 = json.dumps(dict2)
>>> print(type(str2))
<class 'str'>
>>> print(str2)
{"username": "admin", "password": 123456}
>>>

需要注意的是,按 json 的标准规范是使用双引号 "",因此在转换之后得到的json字符串是双引号的。

如果我们想让得到的字符串仍保持单引号,可以通过 replace() 方法来简单处理一下。

>>> dict3 = {'username': 'admin', 'password': 123456}
>>> import json
>>> str3 = json.dumps(dict3).replace("\"", "'")
>>> print(type(str3))
<class 'str'>
>>> print(str3)
{'username': 'admin', 'password': 123456}
>>>

字典--列表

字典转列表

  • 1.使用内置函数 list()

>>> dict1 = {"a": 1, "b": "2", "c": True}
>>> list1 = list(dict1.keys())
>>> print(list1)
['a', 'b', 'c']
>>> list2 = list(dict1.values())
>>> print(list2)
[1, '2', True]
>>>

列表转字典

  • 1.使用内置函数 dict(),将嵌套列表转换为字典

>>> list3 = [['a', 1], ['b', '2'], ['c', True]]
>>> dict2 = dict(list3)
>>> print(type(dict2))
<class 'dict'>
>>> print(dict2)
{'a': 1, 'b': '2', 'c': True}
>>>
  • 2.使用内置函数 zip(),将2个列表转换为字典

>>> list1 = ["a", 'b', "c", 'd', "f"]
>>> list2 = ["1", '2', "3", '4', "5"]
>>> dict1 = dict(zip(list1,list2))
>>> print(type(dict1))
<class 'dict'>
>>> print(dict1)
{'a': '1', 'b': '2', 'c': '3', 'd': '4', 'f': '5'}
>>>

如果2个列表的长度不一样时,那么就不展示多出来的元素。

>>> list1 = ["a", 'b', "c"]
>>> list2 = ["1", '2', "3", '4', "5"]
>>> dict1 = dict(zip(list1,list2))
>>> print(type(dict1))
<class 'dict'>
>>> print(dict1)
{'a': '1', 'b': '2', 'c': '3'}
>>>

  • 8
    点赞
  • 39
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值