簡體   English   中英

合並列表中的多行

[英]Combining multiple lines within a list

我創建了一個腳本,該腳本從多個文件中讀取數據以生成模式。 但是,由於我試圖逐列生成模式,因此我決定將整個數據編碼為坐標系。

例:

[('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開頭的字符串的組合,依此類推。

有人可以幫助我還是指導我正確的方向。 我不知道如何遍歷列表並將字符串組合成每一行的各自模式。

一種方法是將它們轉換為二進制文件並映射為所需的字符串。

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

現在觀察到,如果我們使用邏輯'or'( | )運算符組合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'替換為'',並將其正確格式化。

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

上面的意思是這樣嗎?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM