当前位置: 首页 > 知识库问答 >
问题:

Python判决和枚举用法[重复]

解翰采
2023-03-14

我有点困惑的一块python的代码在使用dict:

>>> S = "ababcbacadefegdehijhklij"
>>> lindex = {c: i for i, c in enumerate(S)}
>>> lindex
{'a': 8, 'c': 7, 'b': 5, 'e': 15, 'd': 14, 'g': 13, 'f': 11, 'i': 22, 'h': 19, 'k': 20, 'j': 23, 'l': 21}

如何理解“{c:i代表枚举中的i,c}”?谁能给我解释一下吗?

共有2个答案

郑宜民
2023-03-14

归根结底,这将创建字符串中每个字符最后出现的字典。这里是如何...

第一个enumerate返回一个iterable,其中的元素是索引和值的元组。

print(*enumerate(['a', 'b', 'c']))
(0, 'a') (1, 'b') (2, 'c')

因为S是一个可迭代的字符串,所以枚举(S)返回对应于...

(0, 'a') (1, 'b') (2, 'a') (3, 'b') (4, 'c') ...

其次,此枚举对象由字典理解使用,这是创建字典的一种简洁方法。

d = { x: x + 1 for x in range(3) }
{0: 1, 1: 2, 2: 3}

字典理解用于创建字典,其中键是字符串S中的字母,项是字符的索引。

由于字典的键只能与单个值关联,因此只保留最后一个值,即字符出现的最后一个索引。

如果没有枚举和字典理解,代码相当于。。。

S = "ababcbacadefegdehijhklij"

lindex = {}

for i in range(len(lindex)):
    lindex[i] = S[i]
徐俊楚
2023-03-14

我将把这一行分成几行,这样更容易理解。以下代码与示例中的一行程序执行相同的操作:

S = "ababcbacadefegdehijhklij"
lindex = {}

for count, letter in enumerate(S):
    lindex[letter] = count

print(lindex)

产出将是:

{0:a',1:b',2:a',3:b',4:c',5:b',6:a',7:c',8:a',9:d',10:e',11:f',12:e',13:g',14:d',15:e',16:h',17:i',18:j',19:h',20:k',21:l',22:i',23:j'

(重要的是要注意字典值是随机显示的,因为顺序无关紧要。)

enumerate所做的是遍历字符串中的每个字母,但同时输出字母和计数。因此,它将从count=0letter=“a”,然后是count=1letter=“b”等等开始。然后将这些值添加到字典中,lindex,键为字母,值为计数。

然而,重要的是要注意,字典中只能有一个键,所以每次出现相同的字母时,它的字典值都会被替换。

 类似资料:
  • 问题内容: 这个问题已经在这里有了答案 : 10年前关闭。 复制: 在Python中实现“枚举”的最佳方法是什么? 在python中进行枚举的公认方法是什么? 例如,目前我正在编写游戏,希望能够将“上”,“下”,“左”和“右”移动。我使用字符串是因为我还没有弄清楚枚举在python中是如何工作的,所以我的逻辑充满了这样的东西: 我想用类似的东西代替 问题答案:

  • 谁能解释一下 和 我经常使用前一个示例(可能太频繁了,没有足够的封装),但我从未使用过第二个示例。 谢啦 枚举

  • 一些具有特殊含义的类,其实例化对象的个数往往是固定的,比如用一个类表示月份,则该类的实例对象最多有 12 个;再比如用一个类表示季节,则该类的实例化对象最多有 4 个。 针对这种特殊的类, Python 3.4 中新增加了 Enum 枚举类。也就是说,对于这些实例化对象个数固定的类,可以用枚举类来定义。 例如,下面程序演示了如何定义一个枚举类: 如果想将一个类定义为枚举类,只需要令其继承自 enu

  • 问题内容: 我正在用Java编写游戏,该游戏由一排瓷砖组成。我将无法以独创性方式定义图块的边缘以及它们之间的相互关系,例如,要获得图块的相对边缘,我希望能够输入。但是,当使用枚举定义这些边时,我最终不得不在构造函数中转发至少其中两个引用: 有没有什么办法可以使用枚举来解决这个问题呢? 问题答案: 您可以这样做不是那么直观。

  • 为什么我在浏览java时看不到

  • 问题内容: 当我使用DataContractJsonSerializer序列化枚举值时,它将序列化枚举的数值,而不是字符串名称。 IE浏览器: 序列化foo.bar的值将返回“ 0”,而不是“ bar”。 我更喜欢它,是否有一种方法可以覆盖它? 编辑: 因为我不想更改序列化程序,所以我使用了一个简单的变通办法。 我在类中公开了要序列化的属性,该属性在值上调用ToString,即: 问题答案: 看起