我创建了一个脚本,它从多个文件中读取数据以生成模式。但是,由于我试图逐列生成模式,我决定将整个数据编码为坐标系。
示例:
[('0', 1), ('0', 2), ('0', 3), ('1', 4), ('2', 5), ('3', 6), ('3', 7), ('3', 8), ('2', 9), ('1', 10), ('0', 11), ('-1', 12), ('-2', 13), ('-3', 14), ('-3', 15), ('-3', 16), ('-2', 17), ('-1', 18), ('0', 19), ('0', 20), ('0', 21)]
之后,根据模式的大小,我取坐标并将其转换为模式:
['0\t*', '0\t *', '0\t *', '1\t *', '2\t *', '3\t *', '3\t *', '3\t *', '2\t *', '1\t *', '0\t *', '-1\t *', '-2\t *']
好。所以,现在我的问题是我想要结合'字符串'以相同的坐标开始。
基本上,0处的值将成为以0开头的四个字符串的组合。
0\t*** *
1处的值将是以1开头的两个字符串的组合,依此类推。
有人可以帮助我或引导我走向正确的方向。我不知道如何在列表中循环,并将字符串组合成各行的各自模式。
答案 0 :(得分:1)
一种方法是将它们转换为二进制并映射到您需要的字符串。
data = [('0', 1), ('0', 2), ('0', 3), ('1', 4), ('2', 5), ('3', 6), ('3', 7), ('3', 8), ('2', 9), ('1', 10), ('0', 11), ('-1', 12), ('-2', 13), ('-3', 14), ('-3', 15), ('-3', 16), ('-2', 17), ('-1', 18), ('0', 19), ('0', 20), ('0', 21)]
output = {}
for (k,v) in data:
if k not in output:
output[k] = 0
output[k] = 2**v | output[k] # map to binary space.
for k in output:
tmp = bin(output[k])[2:][::-1] #cut binary prefix and reverse it.
stared = tmp.replace('1', '*').replace('0',' ')
print('%s\t%s' % (k,stared))
结果:
0 *** * ***
1 * *
2 * *
3 ***
-1 * *
-2 * *
-3 ***
说明:
确定。第一个for循环。 基本上,我将每个数字改为2的幂。 我这样做是因为二进制字符串的属性可以用来表示'*'或''的每个位置。
('0',1) --> ('0',2) # 01
('0',2) --> ('0',4) # 001
('0',3) --> ('0',8) # 0001
('1',4) --> ('1',16)
...
so on
现在观察如果我们使用逻辑'或'(|
)运算符组合01,001,0001,我们将得到相当多的结果('0',0111)。
第一个循环的原始结果将是:
{'0': 3672078, '1': 1040, '2': 544, '3': 448, '-1': 266240, '-2': 139264, '-3': 114688}
这些数字非常可怕,但不要让代表欺骗你。它以二进制形式排列好而有意义。
例如'0': 3672078
是'0': 0b1110000000100000001110
,它匹配所需的内容(按相反顺序)。
第二个循环仅仅是将其转换为二进制表示。
bin
是一个python内置函数,用于将十进制数转换为二进制字符串。例如bin(2) --> 0b01
。现在,我们不需要0b
前缀,因此我们将其[:2]
运算符剪切掉。它将返回跳过前两个字符的字符串。
之后,[::-1]
运算符已添加以反转二进制字符串,因为原始表单具有最右侧的值(具有最高值的位)
然后,在最后一步中,我们用'*'替换'1',用''替换'0'并正确格式化。
答案 1 :(得分:0)
x = ['0\t*', '0\t *', '0\t *', '1\t *', '2\t *', '3\t *']
y = [i for i in x if i.startswith('0\t')]
y
['0 \ t *','0 \ t *','0 \ t *']
你的意思是上面这样的吗?