组合列表中的多个行

时间:2018-04-15 19:07:08

标签: python

我创建了一个脚本,它从多个文件中读取数据以生成模式。但是,由于我试图逐列生成模式,我决定将整个数据编码为坐标系。

示例:

[('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开头的两个字符串的组合,依此类推。

有人可以帮助我或引导我走向正确的方向。我不知道如何在列表中循环,并将字符串组合成各行的各自模式。

2 个答案:

答案 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 *']

你的意思是上面这样的吗?