Fórum Root.cz
Hlavní témata => Vývoj => Téma založeno: Wangarad 23. 02. 2021, 16:10:50
-
Zdravim.
V Pythone som napisal funkciu ktora by mala hlupo nahradzovat string v retazci ale deje sa nieco zvlastne.
Vzdy ked je hodnota rovna maximalnej dlzke nespocita to spravne znaky pred.
def Position_in_Array (string,Position,array):
Start_Position = Position
string = string
Data_lenght = len(string)
Data_after_position = int(Data_lenght)
#data after position
array_after_inserted_data = array[Position:]
#data before position actual position -
Data_before_pos = Start_Position - Data_lenght
array_before_inserted_data = array[:Data_before_pos]
output = array_before_inserted_data + string + array_after_inserted_data
return output
print(Position_in_Array('1000',32, 'ABCDERTAGSHDJFKWORKDBANDREDBVAD'))
Priklad je string : ABCDERTAGSHDJFKWORKDBANDREDBVAD
Ak napisem
print(Position_in_Array('1000',4, 'ABCDERTAGSHDJFKWORKDBANDREDBVAD'))
vysledok je 1000ERTAGSHDJFKWORKDBANDREDBVAD teda vsetko OK.
Ak napisem
print(Position_in_Array('1000',32, 'ABCDERTAGSHDJFKWORKDBANDREDBVAD'))
tak vysledok je
ABCDERTAGSHDJFKWORKDBANDREDB1000 co je zle lebo uz je to mimo dlzku originalneho stringu. Preco sa tak deje?
Malo by to pekne pocitat ale pri 32 to nejde.
-
Ten kód je příšerný, ale jestli dobře chápu problém, pak je to zřejmě klasická chyba off-by-one. Ten kód dělá přesně to, co je v něm napsané:
>>> str = 'ABCDERTAGSHDJFKWORKDBANDREDBVAD'
>>> len(str)
31
>>> 32-4
28
>>> str[:28]
'ABCDERTAGSHDJFKWORKDBANDREDB'
>>> str[:28] + '1000'
'ABCDERTAGSHDJFKWORKDBANDREDB1000'
Takže si pořádně spočítej písmena a případně doplň nějaké kontroly.
A když už to budeš přepisovat, věz, že length se píše takhle a ne jinak a že string = string k ničemu není, stejně jako není k ničemu používat náhodně Start_Position a Position. A v neposlední řadě by bylo fajn psát všechny proměnné stejným stylem. PEP-8 doporučuje (https://www.python.org/dev/peps/pep-0008/#function-and-variable-names) malá písmena a podtržítka.
-
Ok moja chyba.
Teda takto. def Position_in_Array (string,Position,array):
print('Dlzka Array')
print(len(array))
Start_Position = Position
print('Dlzka Stringu')
print(len(string))
Data = len(string)
#data after position
array_after_inserted_data = array[Data:]
print('Kolko ostalo potom')
print(len(array_after_inserted_data))
#data before position actual position -
Data_before_pos = Start_Position - Data
print('Kolko pozicii vpred uchovaj')
print(Data_before_pos)
array_before_inserted_data = array[:Data_before_pos]
output = array_before_inserted_data + string + array_after_inserted_data
print('Dlzka Vystupu')
print(len(output))
return output
print(Position_in_Array('1000',32, '00000000000000000000000000000000'))
Vysledok
Dlzka Array
32
Dlzka Stringu
4
Kolko ostalo potom
28
Kolko pozicii vpred uchovaj
28
Dlzka Vystupu
60
000000000000000000000000000010000000000000000000000000000000
Co chcem je odstrihnut s tych 32 posledne 4 pridat string ale nieco je zle.
Lebo ak zadam
print(Position_in_Array('1000',10, '00000000000000000000000000000000'))
Dlzka Array
32
Dlzka Stringu
4
Kolko ostalo potom
28
Kolko pozicii vpred uchovaj
6
Dlzka Vystupu
38
00000010000000000000000000000000000000
-
Když to neumíš popsat slovy, tak to třeba nakresli, nebo něco.
Tohle?
def replaceat(original, replacement, replacement_end):
replacement_start = replacement_end - len(replacement)
return original[:replacement_start] + replacement + original[replacement_end:]
print(replaceat('00000000000000000000000000000000', '1000', 32))
print(replaceat('00000000000000000000000000000000', '1000', 10))
-
..........
Co chcem je odstrihnut s tych 32 posledne 4 pridat string ale nieco je zle.
.............
musíš udělat veselej xiftík :-4 :-4 ;D ;D ;) ;)
#!/usr/bin/env python3
wangaraduv_string = '0' * 32
print(wangaraduv_string)
wangaraduv_string = wangaraduv_string[:-4] + '1234'
print(wangaraduv_string)
btw celý to vipadá jako nějaký divný dělání s bitama/bytama :o ;)
víc rychlejší to bude když jakoby použiješ misto stringů bitový voperace hele (https://wiki.python.org/moin/BitwiseOperators) a eště vo mocmocmoc strašně víc rychlejší když nato jako vemeš cffi hele (https://www.abclinuxu.cz/blog/jenda/2021/2/python-c-a-cffi) :o :o :D ;)
-
Prosim, neznasilnujte takhle ten Python ;) string = string je fakt priserny, ale z toho, co jste napsal, to je to nejhezci. Taky si obcas na papir napisu, ze 4 = 4 nebo π = π, abych nezapomnel a zaroven se trochu procvicil v matematice ;)
Pokud i presto, co jsem napsal, chcete poradit, napiste cele zadani. Nevypada to, ze bude slozite, jen nechapu, ceho chcete docilit.