Zamiana liczb

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ą


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)
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:

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")

2) klucz z numeracji pierwszej do drugiej (lub odwrotnie)

Czyli w Twoim przypadku:

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.

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)

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.

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:

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

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0