#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
в списке (третий цикл будет повторяться по списку, поэтому вложение выполняется трижды). Это был бы самый простой способ справиться с этой проблемой и избежать повторения! (вы можете избежать печати чисел с нулевым количеством).