Словарь добавляется и печатается случайным образом - PullRequest
0 голосов
/ 10 мая 2018

Хорошо, прежде чем я спрашиваю, я уже видел следующие ответы:

Python OrderedDict не поддерживает порядок элементов

Преобразование диктов в OrderedDict

OrderedDict не сохраняет порядок

но я все еще не могу сделать это правильно.

Справочная информация: у меня есть файл Groundtruth, например, jp1_GT.txt (есть и другие файлы, по разным путям, но в настоящее время я имею дело только с одним файлом) по некоторому пути. В этом файле каждая строка представляет один ограничивающий прямоугольник в формате. Я изменяю некоторые вычисления и собираюсь записать их в новый основной файл.

#Path containing old folders
src_path = r"C:\Users\username\Downloads\LITIV_dataset"

#dictionary creation
newgtdict ={}

for folderName in os.listdir(src_path):
  folderPath = src_path + "\\" + folderName

  if not os.path.isdir(folderPath):
    continue

  listOfFilePaths = glob.glob(folderPath + "\\"+ folderName +"_GT.txt")
  for filePath in listOfFilePaths:

    openedFile = open(filePath, 'r')
    lines = openedFile.readlines()
    linecount =0

    for line in lines:
        linecount+=1
        linenumber = str(linecount)
        my_list = str(line).split(",")
        bboxes=[]

        #checking for non-empty lines
        if len(my_list)>0:
            x_br = int(my_list[2])
            y_br = int(my_list[3])
            x_tl = int(my_list[0]) - (x_br/2)
            y_tl = int(my_list[1]) - (y_br/2)
            box = [x_tl,y_tl,x_br,y_br]
        newgtdict[str(filePath)+str(linenumber)] = box 
        print newgtdict

Первые четыре строки моего jp1_GT.txt выглядят так:

189,163,72,72
190,162,72,72
188,160,72,72
189,163,72,72

Однако первые четыре строки вывода выглядят так:

{'C:\\Users\\username\\Downloads\\LITIV_dataset\\jp1\\jp1_GT.txt1': [153, 127, 72, 72]} 
{'C:\\Users\\username\\Downloads\\LITIV_dataset\\jp1\\jp1_GT.txt1': [153, 127, 72, 72], 'C:\\Users\\username\\Downloads\\LITIV_dataset\\jp1\\jp1_GT.txt2': [154, 126, 72, 72]} 
{'C:\\Users\\username\\Downloads\\LITIV_dataset\\jp1\\jp1_GT.txt1': [153, 127, 72, 72], 'C:\\Users\\username\\Downloads\\LITIV_dataset\\jp1\\jp1_GT.txt3': [152, 124, 72, 72], 'C:\\Users\\username\\Downloads\\LITIV_dataset\\jp1\\jp1_GT.txt2': [154, 126, 72, 72]}
{'C:\\Users\\username\\Downloads\\LITIV_dataset\\jp1\\jp1_GT.txt4': [153, 127, 72, 72], 'C:\\Users\\username\\Downloads\\LITIV_dataset\\jp1\\jp1_GT.txt1': [153, 127, 72, 72], 'C:\\Users\\username\\Downloads\\LITIV_dataset\\jp1\\jp1_GT.txt3': [152, 124, 72, 72], 'C:\\Users\\username\\Downloads\\LITIV_dataset\\jp1\\jp1_GT.txt2': [154, 126, 72, 72]}

Ожидаемые первые 4 строки вывода:

{'C:\\Users\\username\\Downloads\\LITIV_dataset\\jp1\\jp1_GT.txt1': [153, 127, 72, 72]} 
{'C:\\Users\\username\\Downloads\\LITIV_dataset\\jp1\\jp1_GT.txt2': [154, 126, 72, 72]} 
{'C:\\Users\\username\\Downloads\\LITIV_dataset\\jp1\\jp1_GT.txt3': [152, 124, 72, 72]} 
{'C:\\Users\\username\\Downloads\\LITIV_dataset\\jp1\\jp1_GT.txt4': [153, 127, 72, 72]} 

Просто побочный вопрос: вы предлагаете какой-нибудь другой лучший способ для этого.

1 Ответ

0 голосов
/ 10 мая 2018

Вы печатаете словарь на каждой итерации, а не новый элемент в словаре на каждой итерации.

Вы можете сделать:

for line in lines:
    # <snip>
    newgtdict[str(filePath)+str(linenumber)] = box 
    print box

или

for line in lines:
    # <snip>
    newgtdict[str(filePath)+str(linenumber)] = box 
    # don't print here

for line in newgtdict:
    print(line)

Обратите внимание, что вы не используете OrderedDict, что вам следует (если вы хотите упорядоченные результаты в версиях Python ранее 3.7)

newgtdict = collections.OrderedDict()
# rather than = {}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...