首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >基于字符串迭代声明变量?

基于字符串迭代声明变量?
EN

Stack Overflow用户
提问于 2017-08-13 02:40:16
回答 3查看 105关注 0票数 1

不确定以前是否有人问过这个问题。这是一个有点奇怪的问题,所以我将继续发问。

我有一些变量(或者更确切地说是常量)的定义:

代码语言:javascript
复制
# Constants

# Colors
RED="RED"
ORANGE="ORANGE"
YELLOW="YELLOW"
GREEN="GREEN"
CYAN="CYAN"
BLUE="BLUE"
MAGENTA="MAGENTA"
# Modes
PANIC="PANIC"
SOLID="SOLID"
BREATHING="BREATHING"
# Special sub-modes (for panic)
BLINKING="BLINKING"

# Declare them
SOLID_RED="{}_{}".format(SOLID,RED)
SOLID_BLUE="{}_{}".format(SOLID,BLUE)
SOLID_MAGENTA="{}_{}".format(SOLID,MAGENTA)
## ..
BREATHING_RED="{}_{}".format(BREATHING,RED)
BREATHING_BLUE="{}_{}".format(BREATHING,BLUE)
BREATHING_MAGENTA="{}_{}".format(BREATHING,MAGENTA)
## ..
PANIC_RED="{}_{}".format(PANIC,RED)
PANIC_BLUE="{}_{}".format(PANIC,BLUE)
PANIC_MAGENTA="{}_{}".format(PANIC,MAGENTA)
## ..
PANIC_BLINKING="{}_{}".format(PANIC,BLINKING)

我有很多定义!而不是像这样键入所有这些常量,有没有办法只使用# declare them之前的定义,或者使用字典,就可以将所有这些常量构造为字符串?

对于这种迭代构造,我需要的格式是:MODE_COLOR命名约定。

我要求这个答案使用Python2.7。因为我包含了一些相关的2.7 API。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2017-08-13 03:01:00

使用itertools.combinationslocals()的另一种方式

代码语言:javascript
复制
from itertools import combinations
from pprint import pprint

# Colors
RED="RED"
ORANGE="ORANGE"
YELLOW="YELLOW"
GREEN="GREEN"
CYAN="CYAN"
BLUE="BLUE"
MAGENTA="MAGENTA"
# Modes
PANIC="PANIC"
SOLID="SOLID"
BREATHING="BREATHING"
# Special sub-modes (for panic)
BLINKING="BLINKING"

v_consts = {k:v for k, v in locals().items() if k.isupper()}
combs = combinations(v_consts.values(), 2)
d_consts = {'%s_%s' % k: '%s_%s' % k for k  in combs}
pprint(d_consts)

# Edit:
# If you want to add the created variables in Python's scope
# You can do something like this
globals().update(d_consts)
print SOLID_BLINKING, type(SOLID_BLINKING)

输出:

代码语言:javascript
复制
{'BLINKING_CYAN': 'BLINKING_CYAN',
 'BLINKING_MAGENTA': 'BLINKING_MAGENTA',
 'BLINKING_ORANGE': 'BLINKING_ORANGE',
 'BLINKING_PANIC': 'BLINKING_PANIC',
 'BLINKING_RED': 'BLINKING_RED',
  ...
 'YELLOW_MAGENTA': 'YELLOW_MAGENTA',
 'YELLOW_ORANGE': 'YELLOW_ORANGE',
 'YELLOW_PANIC': 'YELLOW_PANIC',
 'YELLOW_RED': 'YELLOW_RED'}
 SOLID_BLINKING <type 'str'>
票数 2
EN

Stack Overflow用户

发布于 2017-08-13 02:53:13

我会使用字典作为容器来存储变量。只需在列表中列出所有的颜色和模式,然后使用字典理解:

代码语言:javascript
复制
colors_list = ['red', 'blue']
modes_list = ['panic', 'solid']
color_modes = {k1 + '_' + k2: k1.upper() + '_' + k2.upper()
               for k1 in colors_list for k2 in modes_list}
>>> color_modes
{'blue_panic': 'BLUE_PANIC',
 'blue_solid': 'BLUE_SOLID',
 'red_panic': 'RED_PANIC',
 'red_solid': 'RED_SOLID'}
票数 2
EN

Stack Overflow用户

发布于 2017-08-13 02:51:15

我认为你想要做的是散发出一种代码的味道。

我可能会使用字典和叉积来解决这个问题。下面是一个简化的例子:

代码语言:javascript
复制
from itertools import product

A = ['a', 'b', 'c']
B = ['d', 'e', 'f']

AB = {"{0} {1}".format(a, b): "{0}_{1}".format(a, b) for a, b in product(A, B)}

print(AB)

您可以将此应用于颜色和修改器,并按名称访问颜色:

代码语言:javascript
复制
colors['Magenta Solid']
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45653697

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档