[英]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.