Python: подсчитайте количество изменений чисел

#python

#python

Вопрос:

Я знаю, что название сбивает с толку, я не знал, как еще это объяснить, поэтому вот лучшее объяснение:

У меня есть файл, где каждая строка записывается следующим образом:

a, b, c

где a, b и c — числа. Здесь числа a не имеют значения. Здесь предполагается, что b — это какие-то координаты, а c — номер группы.

Для каждого c мне нужно найти количество каждого вида движений, сделанных группой.

Например, предположим, что мой файл выглядит примерно так:

23,20,789
25,7,789
29,7,789
32,20,789
0,2,870
3,40,870

Итак, мне нужно подсчитать, сколько раз группа 789 перемещается с 1 на 1, с 1 на 2, …, с 7 на 7, … с 20 на 7, с 20 на 8, … и так далее до 117 на 117. И сделайте это для каждой группы.

Конечно, там будет много нулей, что нормально. Так, например, здесь я должен найти:

Для группы 789: 1 перемещение с 20 на 7, 1 перемещение с 7 на 7, 1 перемещение с 7 на 20 и 0 перемещений для всех других комбинаций перемещений.

Для группы 870: 1 перемещение от 2 до 40 и 0 для всех других комбинаций перемещений.

Надеюсь, это было понятно.

Я знаю, что должен поместить то, что я начал делать, но это моя проблема. Я действительно не знаю, с чего начать. Я имею в виду, я знаю, как подсчитать, сколько раз цифра или строка появляется в тексте, но для подсчета изменений, особенно по группам, я понятия не имею, с чего начать.

Я надеюсь, вы можете помочь мне хотя бы начать.

Спасибо

РЕДАКТИРОВАТЬ: Вот что у меня есть на данный момент благодаря @Tojrah

 f1=open("My_file_where_the_coordinates_for_one_group_are_all_in_one_line.txt","r")
f2=open("File_of_counts.txt","a")
line=f1.readline()
s=line.split()
count=0

for i in range (0,len(s)-1):
    for j in range (1,len(s)-1):
        if s[j]==s[i] and s[j 1]==s[i 1]:
            count =1
    f2.write("from {} to {} , result= {}n".format(s[i], s[i 1], count))
    count=0
f1.close()
f2.close()
  

Но вы наверняка можете догадаться, вот частично показанный результат:

 from 20 to 7 , result= 5
from 7 to 7 , result= 9
from 7 to 20 , result= 6
from 20 to 20 , result= 28242
from 20 to 20 , result= 28242
from 20 to 20 , result= 28242
from 20 to 20 , result= 28242
  

Вы можете видеть, что подсчеты хороши, но он подсчитывает одни и те же движения несколько раз. Как остановить подсчет уже подсчитанных перемещений?

ПРАВКА 2: Вот изменения, которые я внес в код @Tojrah:

 for i in range (1,118):
for j in range (1,118):
    count=0
    for k in range (0, len(s)-1):
        if (str(i)==s[k] and str(j)==s[k 1]):
            count =1
    f.write("from {} to {} , result= {}n".format(i, j, count))
    count=0
  

Теперь это работает отлично.
Еще раз спасибо @Tojrah за помощь мне.

Ответ №1:

Вы можете добавить все значения на втором месте (номер b) в списке для определенной группы (скажем, 789). Затем просто выполните итерацию по списку, используя вложенные циклы, и вы сможете получить все нужные вам ходы. Надеюсь, это то, что вы хотите. Код:

 for i in range(1,118):
    for j in range(1,118):
         count=0
         for p in range(len(list)-1):
             if(list[p]==i and list[p 1]==j):
                 count =1
         if(count!=0):
             #print/write Statement here
  

Если вы все еще застряли, я могу вам помочь 🙂

Комментарии:

1. Спасибо за ваш ответ, я попробую это.

2. Я добавил некоторый код из того, что вы сказали, и отредактировал с его помощью свой первый пост. Если бы вы могли сказать мне, что я делаю не так, я был бы очень благодарен. Спасибо

3. Можете ли вы показать мне, что такое s. Я имею в виду, как вы разделяете строку (какой разделитель для разделения?). Кроме того,readline должен возвращать только одну строку

4. f1 — это мой файл координат, записанный вот так: 20 20 7 7 8 10 20 20 в одну строку. s — это просто список координат, означающий [20,20,7,7,8,10,20,20] . Разделителем является пробел.

5. Хорошо, понял. (Извините, поскольку я не видел имя файла F1!). Итак, на самом деле, чтобы избежать повторения, я предлагаю вместо проверки наличия пар в самом списке, вы должны использовать вложенные циклы, каждый из которых идет от 1 до 117, как вы сказали, и проверить количество пар i,j в списке (третий цикл будет повторяться по списку, поэтому вложение выполняется трижды). Это был бы самый простой способ справиться с этой проблемой и избежать повторения! (вы можете избежать печати чисел с нулевым количеством).