Zamiana liczb

MO
  • Rejestracja:prawie 8 lat
  • Ostatnio:3 miesiące
  • Postów:156
0

Mam taki problem. Pracuje z plikami tekstowymi i zastanawiam się jak zrobić pewną sprawę. Mam numerację atomów w jednym pliku i numerację atomów w drugim. Jednak one się różnią - tzn. np. atomowi C1 w pierwszym pliku odpowiada numer 1, a w drugim numer 9. Cztery kolejne atomy w danej linijce pliku mówią nam o kącie torsyjnym (nieważne taka dodatkowa informacja, po prostu one są uorganizowane w cztery atomy w każdej linijce). Oto co chcę zrobić:
Muszę zamienić numerowanie w pierwszym pliku na numerowanie w drugim, czyli np. mam taki plik tekstowy, gdzie w linijce mam:
48 43 38 42
wiem, że w tej drugiej numeracji:
38 odpowiada 48,
42 odpowiada 56,
43 odpowiada 50,
48 odpowiada 51,
więc po zadziałaniu skryptu powinienem mieć taką linijkę:
51 50 48 56

Jak to zrobić? Postanowiłem, że użyję słownika. Potem spróbuję jakoś to zrobić pętlą

Kopiuj
torsion = { 1 : 9,
2 : 8,
3 : 6,
4 : 7,
....

....
148 : 20,
149 : 19,
150 : 22, }
myfile = "torsyjne"
with open(myfile, "r") as kt:
    lines = kt.read().splitlines()
with open(myfile, "w") as fp:
    for line in lines:
        print(i tu nie wiem jak to zrobić, chciałem zrobić coś takiego, żeby value zastępowało key, jedna numeracja z drugiej)```


Dodam jeszcze, że mogę to zrobić w awk poprzez gsub typu (awk '{ gsub(/1/, "9"); print }' file xxx), ale musiałbym 150 linijek kodu robić i zastanawiałem się czy z pythonem nie pójdzie mi szybciej)
edytowany 1x, ostatnio: Morgotheron
TurkucPodjadek
TurkucPodjadek
  • Rejestracja:ponad 8 lat
  • Ostatnio:około 4 lata
  • Postów:607
1

Nie podałeś informacji jak wygląda druga numeracja.

Ale wstępnie ja bym użył dicta, np atom_nums, który przechowuje (albo):

  1. listę z tymi numerami, czyli [48, 43, 38, 42], gdzie kluczem jest to całe C1, czyli:
Kopiuj
atom_nums[C1] = [48, 43, 38, 42]

W ten sposób, jak w drugim pliku też masz C1 (tego nie napisałeś, bo napisałeś tylko wiem, że w tej drugiej numeracji) to pobierzesz podobnie odpowiadające numery
z pliku drugiego dla C1 (zakładam, że to jest "łącznik")

  1. klucz z numeracji pierwszej do drugiej (lub odwrotnie)

Czyli w Twoim przypadku:

Kopiuj
atom_number[38] = 48

Tylko też nie wiem czy to optymalne, bo nie znam algorytmu "łącznika", w sensie co łączy informacje o tym samym atomie w dwóch różnych plikach, nazwa, numer linii w pliku czy jakaś inna formuła. W tym tutaj przypadku po prostu wyświetlasz dicta iterując po kluczach, którymi są wartości z jednego pliku.

MO
  • Rejestracja:prawie 8 lat
  • Ostatnio:3 miesiące
  • Postów:156
0

Tu jest podana druga numeracja:
Piersza liczba w każdej dwójce to numeracja pierwsza, a druga liczba to odpowiadająca jej druga numeracja)

Czyli w pierwszej numeracji atom C1 ma numer 1, a w drugiej numeracji atom C1 ma numer 9. W pierwszej numeracji atom O1 ma numer 2, a w drugiej 8.
torsion = { 1 : 9,
2 : 8,
3 : 6,
4 : 7,
5 : 4,
6 : 10,
7 : 5,
8 : 23,
9 : 3 ,
10 : 11,
11 : 12,
12 : 14,
13 : 24,
14 : 1,
15 : 13,
16 : 15,
17 : 16,
18 : 39,
19 : 26,
20 : 25,
21 : 40,
22 : 41,
23 : 35,
24 : 42,
25 : 36,
26 : 37,
27 : 31,
28 : 43,
29 : 44,
30 : 27,
31 : 38,
32 : 32,
33 : 33,
34 : 45,
35 : 28,
36 : 29,
37 : 34,
38 : 48,
39 : 46,
40 : 47,
41 : 30,
42 : 56,
43 : 50,
44 : 49,
45 : 59,
46 : 57,
47 : 58,
48 : 51,
49 : 60,
50 : 53,
51 : 52,
52 : 62,
53 : 61,
54 : 65,
55 : 63,
56 : 64,
57 : 68,
58 : 66,
59 : 67,
60 : 71,
61 : 70,
62 : 69,
63 : 74,
64 : 72,
65 : 73,
66 : 77,
67 : 75,
68 : 76,
69 : 80,
70 : 79,
71 : 78,
72 : 83,
73 : 81,
74 : 82,
75 : 85,
76 : 84,
77 : 87,
78 : 86,
79 : 90,
80 : 89,
81 : 88,
82 : 92,
83 : 91,
84 : 94,
85 : 93,
86 : 97 ,
87 : 95,
88 : 96,
89 : 99,
90 : 98,
91 : 101,
92 : 100,
93 : 104,
94 : 103,
95 : 102,
96 : 107,
97 : 106,
98 : 105,
99 : 108,
100 : 54,
101 : 55,
102 : 111,
103 : 110,
104 : 109,
105 : 114,
106 : 112,
107 : 113,
108 : 117,
109 : 115,
110 : 116,
111 : 120,
112 : 119,
113 : 118,
114 : 123,
115 : 121,
116 : 122,
117 : 126,
118 : 124,
119 : 125,
120 : 128,
121 : 127,
122 : 130,
123 : 129,
124 : 133,
125 : 132,
126 : 131,
127 : 135,
128 : 134,
129 : 137,
130 : 136,
131 : 140,
132 : 139,
133 : 138,
134 : 142,
135 : 141,
136 : 144,
137 : 143,
138 : 147,
139 : 146,
140 : 145,
141 : 148,
142 : 150,
143 : 149,
144 : 2,
145 : 18,
146 : 17,
147 : 21,
148 : 20,
149 : 19,
150 : 22, }

Czyli utworzyłem już słownik dictionary = {key(mój klucz jest numeracją pierwszą): value(moja wartość jest jej odpowiadającą wartością drugą)} .Już go napisałem to jest to torsions = {1: 9, ...... 150:22}

mam plik tekstowy z numeracją pierwszą
48 43 38 42
49 45 42 38
48 43 38 34
49 45 42 46
mam słownik, a wszystkie liczby w tym pliku tekstowym to klucze, wystarczy, że zamienie je na wartości!. Pytanie jak to zrobić. Jak zrobić, żeby ten plik tekstowy został odczytany jako zbiór kluczy i został przekonwertowany jako zbiór wartości)

edytowany 3x, ostatnio: Morgotheron
TurkucPodjadek
TurkucPodjadek
  • Rejestracja:ponad 8 lat
  • Ostatnio:około 4 lata
  • Postów:607
1

Zatem, jeżeli numeracje w obu plikach mają zgodne linie, czyli ta sama linia przechowuje dane o tym samym atomie w tych dwóch plikach, to możesz zamiast dicta użyć zwykłej listy - wtedy "kluczem" będzie zwyczajnie pozycja na liście.

Skleciłem lewy kod na szybko, który tworzy lists[], która jest listą liczb pliku drugiego. Kod zadziała tylko z separatorem, który podałeś, czyli : - poza tym jest to odporne na braki przecinków lub nadmiarowe spacje poza separatorem. Natomiast, aby ocenić, kiedy kończy się druga liczba, robi odczyt od końca drugiego członu (tego po :), to na wypadek linii w stylu 1 : 100 , itp.

Kopiuj
def get_atom_numbers(filename):
    lists = []
    with open(filename) as file:
        for line in file:
            try:
                second_part = line.strip().split(" : ")[1]
            except IndexError as e:
                print("invalid line: {}, error: {}".format(line,e))
                continue

            idx = 0
            second_part_len = len(second_part)
            for num in range(second_part_len):
                try:
                    idx = second_part_len-idx-1
                    int(second_part[idx])
                    break
                except ValueError:
                    idx =+ 1
            second_num = second_part[:idx+1]

            try:
                lists.append(int(second_num))
            except ValueError as e:
                print("problem with int conversion, num {}, error: {}".format(second_num,e))
    return lists

Ten kod działa na podstawie tego co wkleiłeś + testowane na pliku o poniższej zawartości:

Kopiuj
1 : 10,
2 :  20,
3 :  30   ,
4 : 40,
5 : 5000,
6 : 1000000
7 :
8

Kliknij, aby dodać treść...

Pomoc 1.18.8

Typografia

Edytor obsługuje składnie Markdown, w której pojedynczy akcent *kursywa* oraz _kursywa_ to pochylenie. Z kolei podwójny akcent **pogrubienie** oraz __pogrubienie__ to pogrubienie. Dodanie znaczników ~~strike~~ to przekreślenie.

Możesz dodać formatowanie komendami , , oraz .

Ponieważ dekoracja podkreślenia jest przeznaczona na linki, markdown nie zawiera specjalnej składni dla podkreślenia. Dlatego by dodać podkreślenie, użyj <u>underline</u>.

Komendy formatujące reagują na skróty klawiszowe: Ctrl+B, Ctrl+I, Ctrl+U oraz Ctrl+S.

Linki

By dodać link w edytorze użyj komendy lub użyj składni [title](link). URL umieszczony w linku lub nawet URL umieszczony bezpośrednio w tekście będzie aktywny i klikalny.

Jeżeli chcesz, możesz samodzielnie dodać link: <a href="link">title</a>.

Wewnętrzne odnośniki

Możesz umieścić odnośnik do wewnętrznej podstrony, używając następującej składni: [[Delphi/Kompendium]] lub [[Delphi/Kompendium|kliknij, aby przejść do kompendium]]. Odnośniki mogą prowadzić do Forum 4programmers.net lub np. do Kompendium.

Wspomnienia użytkowników

By wspomnieć użytkownika forum, wpisz w formularzu znak @. Zobaczysz okienko samouzupełniające nazwy użytkowników. Samouzupełnienie dobierze odpowiedni format wspomnienia, zależnie od tego czy w nazwie użytkownika znajduje się spacja.

Znaczniki HTML

Dozwolone jest używanie niektórych znaczników HTML: <a>, <b>, <i>, <kbd>, <del>, <strong>, <dfn>, <pre>, <blockquote>, <hr/>, <sub>, <sup> oraz <img/>.

Skróty klawiszowe

Dodaj kombinację klawiszy komendą notacji klawiszy lub skrótem klawiszowym Alt+K.

Reprezentuj kombinacje klawiszowe używając taga <kbd>. Oddziel od siebie klawisze znakiem plus, np <kbd>Alt+Tab</kbd>.

Indeks górny oraz dolny

Przykład: wpisując H<sub>2</sub>O i m<sup>2</sup> otrzymasz: H2O i m2.

Składnia Tex

By precyzyjnie wyrazić działanie matematyczne, użyj składni Tex.

<tex>arcctg(x) = argtan(\frac{1}{x}) = arcsin(\frac{1}{\sqrt{1+x^2}})</tex>

Kod źródłowy

Krótkie fragmenty kodu

Wszelkie jednolinijkowe instrukcje języka programowania powinny być zawarte pomiędzy obróconymi apostrofami: `kod instrukcji` lub ``console.log(`string`);``.

Kod wielolinijkowy

Dodaj fragment kodu komendą . Fragmenty kodu zajmujące całą lub więcej linijek powinny być umieszczone w wielolinijkowym fragmencie kodu. Znaczniki ``` lub ~~~ umożliwiają kolorowanie różnych języków programowania. Możemy nadać nazwę języka programowania używając auto-uzupełnienia, kod został pokolorowany używając konkretnych ustawień kolorowania składni:

```javascript
document.write('Hello World');
```

Możesz zaznaczyć również już wklejony kod w edytorze, i użyć komendy  by zamienić go w kod. Użyj kombinacji Ctrl+`, by dodać fragment kodu bez oznaczników języka.

Tabelki

Dodaj przykładową tabelkę używając komendy . Przykładowa tabelka składa się z dwóch kolumn, nagłówka i jednego wiersza.

Wygeneruj tabelkę na podstawie szablonu. Oddziel komórki separatorem ; lub |, a następnie zaznacz szablonu.

nazwisko;dziedzina;odkrycie
Pitagoras;mathematics;Pythagorean Theorem
Albert Einstein;physics;General Relativity
Marie Curie, Pierre Curie;chemistry;Radium, Polonium

Użyj komendy by zamienić zaznaczony szablon na tabelkę Markdown.

Lista uporządkowana i nieuporządkowana

Możliwe jest tworzenie listy numerowanych oraz wypunktowanych. Wystarczy, że pierwszym znakiem linii będzie * lub - dla listy nieuporządkowanej oraz 1. dla listy uporządkowanej.

Użyj komendy by dodać listę uporządkowaną.

1. Lista numerowana
2. Lista numerowana

Użyj komendy by dodać listę nieuporządkowaną.

* Lista wypunktowana
* Lista wypunktowana
** Lista wypunktowana (drugi poziom)

Składnia Markdown

Edytor obsługuje składnię Markdown, która składa się ze znaków specjalnych. Dostępne komendy, jak formatowanie , dodanie tabelki lub fragmentu kodu są w pewnym sensie świadome otaczającej jej składni, i postarają się unikać uszkodzenia jej.

Dla przykładu, używając tylko dostępnych komend, nie możemy dodać formatowania pogrubienia do kodu wielolinijkowego, albo dodać listy do tabelki - mogłoby to doprowadzić do uszkodzenia składni.

W pewnych odosobnionych przypadkach brak nowej linii przed elementami markdown również mógłby uszkodzić składnie, dlatego edytor dodaje brakujące nowe linie. Dla przykładu, dodanie formatowania pochylenia zaraz po tabelce, mogłoby zostać błędne zinterpretowane, więc edytor doda oddzielającą nową linię pomiędzy tabelką, a pochyleniem.

Skróty klawiszowe

Skróty formatujące, kiedy w edytorze znajduje się pojedynczy kursor, wstawiają sformatowany tekst przykładowy. Jeśli w edytorze znajduje się zaznaczenie (słowo, linijka, paragraf), wtedy zaznaczenie zostaje sformatowane.

  • Ctrl+B - dodaj pogrubienie lub pogrub zaznaczenie
  • Ctrl+I - dodaj pochylenie lub pochyl zaznaczenie
  • Ctrl+U - dodaj podkreślenie lub podkreśl zaznaczenie
  • Ctrl+S - dodaj przekreślenie lub przekreśl zaznaczenie

Notacja Klawiszy

  • Alt+K - dodaj notację klawiszy

Fragment kodu bez oznacznika

  • Alt+C - dodaj pusty fragment kodu

Skróty operujące na kodzie i linijkach:

  • Alt+L - zaznaczenie całej linii
  • Alt+, Alt+ - przeniesienie linijki w której znajduje się kursor w górę/dół.
  • Tab/⌘+] - dodaj wcięcie (wcięcie w prawo)
  • Shit+Tab/⌘+[ - usunięcie wcięcia (wycięcie w lewo)

Dodawanie postów:

  • Ctrl+Enter - dodaj post
  • ⌘+Enter - dodaj post (MacOS)