在Python中将列表中的字符串映射到数字的字典
我有一个字符串列表,其中有一些重复的字符串。e、 g.(不是实际清单) 我想创建一个整数列表,其中每个整数对应一个字符串。 e、 g.对于上面的例子在Python中将列表中的字符串映射到数字的字典,python,list,Python,List,我有一个字符串列表,其中有一些重复的字符串。e、 g.(不是实际清单) 我想创建一个整数列表,其中每个整数对应一个字符串。 e、 g.对于上面的例子 [0, 1, 2, 3, 2] 其中0=“你好”,1=“再见”等 我在这里看了一个例子: 我想做基本相同的事情,但反过来,字符串到整数。那部分不应该太难 但是,他们似乎只是在代码中创建字典,如下所示: trans = {0: 'abc', 1: 'f', 2: 'z'} 当您知道列表的确切内容时,自己创建字典就可以了。我的字符串列表非常长,我不
[0, 1, 2, 3, 2]
其中0=“你好”,1=“再见”等
我在这里看了一个例子:
我想做基本相同的事情,但反过来,字符串到整数。那部分不应该太难
但是,他们似乎只是在代码中创建字典,如下所示:
trans = {0: 'abc', 1: 'f', 2: 'z'}
当您知道列表的确切内容时,自己创建字典就可以了。我的字符串列表非常长,我不知道字符串是什么,因为它来自输入。所以我需要从我的字符串列表中以其他方式创建字典,比如for循环
我不知道如何制作一本字典,将列表中的字符串映射为数字。我查阅了如何制作一本包含列表理解的词典,但我不知道它是如何处理重复项的
换句话说,我想知道如何浏览上面的字符串列表,并创建一个字典,如:
{"hello": 0, "goodbye": 1, "hi": 2, "how are you": 3}
编辑:我有很多答案,谢谢大家的帮助。我现在感到困惑的是所有不同的方法。使用enumerate()
、set()
和其他函数有很多建议。还有一个答案(@ChristianIacobs)非常简单,只需要一个for循环。我想知道的是,是否有任何理由使用稍微不那么简单的答案之一?例如,它们是否更快,或者在某些情况下它们是唯一有效的方法?尝试以下方法:
>>> w = ["hello", "goodbye", "hi", "how are you", "hi"]
>>> l = [0, 1, 2, 3, 2]
>>> trans = {l1:w1 for w1,l1 in zip(w,l)}
>>> trans
{0: 'hello', 1: 'goodbye', 2: 'hi', 3: 'how are you'}
您可以通过以下步骤完成此操作:
- 使用
set
- 使用
enumerate
- 循环单词以获得其指定的编号
words=[“你好”、“再见”、“你好”、“你好”]
唯一单词=集合(单词)
单词映射={word:i代表i,枚举中的单词(唯一单词)}
结果=[words\u映射[word]for words in words]
打印(结果)
@jonrsharpe,我不一定担心它们是指数。我基本上希望每个唯一的字符串都有一个唯一的整数,这样字符串就可以被对应的整数替换 然后流程如下:
- 确定我们需要的钥匙的
(原始列表中的每个项目)集合
- 为每个元素分配一个值-最简单的方法是再次为该集合创建一个
(因为根据定义,元素现在是唯一的),并使用该列表中元素的索引。为了构建这种映射,我们可以使用列表
的技巧,就像@jornsharpe已经提出的那样enumerate
- 通过映射转换原始列表
要从列表中创建词典,首先需要消除重复的值。使用集合来实现以下目标:
my_list = ["hello", "goodbye", "hi", "how are you", "hi"]
unique_list = list(set(my_list))
['hi', 'hello', 'goodbye', 'how are you']
现在,您可以通过压缩带有一系列数字的唯一列表来创建词典:
my_dict = dict(zip(unique_list, range(len(unique_list))))
{'hi': 0, 'hello': 1, 'goodbye': 2, 'how are you': 3}
这是我的想法。这将在评论中解释。假设您有一个只包含单词的文件
import re#导入re模块
短语={}#创建字典
file=open(“/path/to/file”,“r”)#打开包含所有短语的文件。
Data=file.read()#读取文件。
cleanedData=re.split(“[\s |\r |\n]”,Data)#删除空白。
对于cleanedData中的word:
如果不是短语中的单词:#检查该单词是否已在词典中。
短语[单词]=(len(短语)+1)#将单词设置为一个键,该键的值从1开始并自动增加,但仅当该键不存在时才添加。
file.close()文件
ans的设计非常简单。你只需要两行就可以做到
该守则是—
l = ['hello', 'goodbye', 'hi', 'how are you', 'hi']
{a: b for b,a in enumerate(l)}
这里枚举创建一个元组(index,value),然后使用for循环进行理解您可以尝试以下操作:
vocab_dict={word:索引的索引,枚举中的单词(列表(集合(单词))}
如果单词列表来自上述示例,则上述词汇的内容如下所示:
语音
{“你好”:0,“你好”:1,“再见”:2,“你好”:3}
dict(枚举(单词))
?或者{word:index表示索引,word在enumerate(words)中}
表示相反。这将为您提供每个单词的最后一个索引。那么您希望忽略重复项吗?dict(zip(数字列表,字符串列表))
?@jornsharpe,我不必担心它们是索引。我基本上希望每个唯一的字符串都有一个唯一的整数,这样字符串就可以被对应的整数替换。@MegaEmailman,我只是想制作一个字典,用一个唯一的整数来标识每个唯一的字符串。所以字典里不应该有任何重复的内容。然后我可以浏览这个列表,制作一个新的列表,用它的等效数字替换每个字符串。实际上,enumerate
可以直接在集合(原始)
上使用,但我认为这对于教学目的来说更为清晰。这种方法似乎最简单,我肯定是用我尝试过的东西过度复杂化了。我只是想知道我使用dict()还是{}是否重要?@IceWarrior42检查这个问题,这样dict()会慢一些吗?或者dict()是这种情况下唯一有效的吗?这在我的程序中似乎有效,所以我将接受它。我仍然很好奇其他答案可能有什么好处。
my_list = ["hello", "goodbye", "hi", "how are you", "hi"]
unique_list = list(set(my_list))
['hi', 'hello', 'goodbye', 'how are you']
my_dict = dict(zip(unique_list, range(len(unique_list))))
{'hi': 0, 'hello': 1, 'goodbye': 2, 'how are you': 3}
l = ['hello', 'goodbye', 'hi', 'how are you', 'hi']
{a: b for b,a in enumerate(l)}