我正在尝试列出所有可能的27个3字符的RGB排列。我的功能如下:
def make_big_RGB():
rgb = ('r', 'g', 'b')
comb_list = []
current_combination = list(rgb) #start with combination (r, g, b)
for x in range(3):
current_combination[0] = rgb[x]
for y in range(3):
current_combination[1] = rgb[y]
for z in range(3):
current_combination[2] = rgb[z]
comb_list.append(current_combination)
print('Added' + str(current_combination))
for _ in comb_list:
print(_)
make_big_RGB()
结果如下:
Added['r', 'r', 'r']
Added['r', 'r', 'g']
Added['r', 'r', 'b']
Added['r', 'g', 'r']
Added['r', 'g', 'g']
Added['r', 'g', 'b']
Added['r', 'b', 'r']
Added['r', 'b', 'g']
Added['r', 'b', 'b']
Added['g', 'r', 'r']
Added['g', 'r', 'g']
Added['g', 'r', 'b']
Added['g', 'g', 'r']
Added['g', 'g', 'g']
Added['g', 'g', 'b']
Added['g', 'b', 'r']
Added['g', 'b', 'g']
Added['g', 'b', 'b']
Added['b', 'r', 'r']
Added['b', 'r', 'g']
Added['b', 'r', 'b']
Added['b', 'g', 'r']
Added['b', 'g', 'g']
Added['b', 'g', 'b']
Added['b', 'b', 'r']
Added['b', 'b', 'g']
Added['b', 'b', 'b']
['b', 'b', 'b']
['b', 'b', 'b']
['b', 'b', 'b']
['b', 'b', 'b']
['b', 'b', 'b']
['b', 'b', 'b']
['b', 'b', 'b']
['b', 'b', 'b']
['b', 'b', 'b']
['b', 'b', 'b']
['b', 'b', 'b']
['b', 'b', 'b']
['b', 'b', 'b']
['b', 'b', 'b']
['b', 'b', 'b']
['b', 'b', 'b']
['b', 'b', 'b']
['b', 'b', 'b']
['b', 'b', 'b']
['b', 'b', 'b']
['b', 'b', 'b']
['b', 'b', 'b']
['b', 'b', 'b']
['b', 'b', 'b']
['b', 'b', 'b']
['b', 'b', 'b']
['b', 'b', 'b']
最后一个for循环打印出想要的结果,但是当我随后尝试打印整个列表时,结果以某种方式列出了27个[b,b,b]项。我不明白为什么。
答案 0 :(得分:4)
这应该有效:
FILE=skeleton
########
# Directories
S_DIR=Source
B_DIR=Build
########
# Output
EXEC=$(B_DIR)/$(FILE)
# default build settings
CC_OPTS=-std=c++11 -c -pipe -Wall -Wno-switch -O3 -xHOST -qopenmp
LN_OPTS=-qopenmp
CC=icpc
########
# SDL options
SDL_CFLAGS := $(shell sdl2-config --cflags)
GLM_CFLAGS := -I../glm/
SDL_LDFLAGS := $(shell sdl2-config --libs)
########
# This is the default action
all:Build
########
# Object list
#
OBJ = $(B_DIR)/$(FILE).o
########
# Objects
$(B_DIR)/$(FILE).o : $(S_DIR)/$(FILE).cpp $(S_DIR)/SDLauxiliary.h $(S_DIR)/TestModelH.h $(S_DIR)/tiny_obj_loader.h
$(CC) $(CC_OPTS) -o $(B_DIR)/$(FILE).o $(S_DIR)/$(FILE).cpp $(SDL_CFLAGS) $(GLM_CFLAGS)
########
# Main build rule
Build : $(OBJ) Makefile
mkdir -p $(B_DIR) && $(CC) $(LN_OPTS) -o $(EXEC) $(OBJ) $(SDL_LDFLAGS)
clean:
rm -f $(B_DIR)/*
答案 1 :(得分:1)
问题在于
comb_list.append(current_combination)
您将相同的列表一次又一次地附加到结果列表中。因此改变该列表中的值,例如使用current_combination[0] = rgb[x]
也会更改所有“其他”列表中的值。
您可以通过在插入之前从该列表创建新列表来解决此问题:
comb_list.append(list(current_combination))
或者只是在将三个元素添加到结果中时直接从三个元素创建该列表:
for x in rgb:
for y in rgb:
for z in rgb:
comb_list.append([x, y, z])
或者只是对整个事情使用列表理解:
comb_list = [[x, y, z] for x in rgb for y in rgb for z in rgb]
或使用itertools.product
,如其他答案中所述。
答案 2 :(得分:0)
一种解决方案:
import itertools
result = itertools.product("rgb",repeat = 3)
print(list(result))