Как мне изменить этот список кортежей на следующий формат?

#python #data-mining

#python #интеллектуальный анализ данных

Вопрос:

Я пытаюсь изменить следующий кортеж:

 [((' "business_id": "zPBccKsIHYtLUGFNYIi8Uw"', ' "business_id": "znDUBjt-m2qmXi_p3m3rDA"'), 0.09523809523809523),((' "business_id": "zauhMY78k36XPfxD3GURkQ"', ' "business_id": "zp-K5s3pGTWuuaVBWo6WZA"'), 0.07407407407407407)]
  

в этот формат:

 {'b1': 'zPBccKsIHYtLUGFNYIi8Uw', 'b2': "znDUBjt-m2qmXi_p3m3rDA', 'sim': 0.09523809523809523}
  

Я попытался поработать над этим, пытаясь изменить его на dict (что невозможно, потому что он не знает, как назначать ключи и значения) и list, но, похоже, ничего не щелкает.

В настоящее время я записываю кортежи в выходной файл с помощью Python с помощью:

 fout = open(outfilePath, mode = 'w')
fwriter = csv.writer(fout, delimiter = ',', quoting = csv.QUOTE_MINIMAL)


for pair in similarPairs:
    fwriter.writerow([ str(pair[0][0]), str(pair[0][1]), pair[1]])
fout.close()
  

Я нахожу похожие пары, используя сходство Jaccard с порогом> = 0.055 по:

 ## Computing the Jaccard Similarity for the candidate pairs.
similarPairs = candidatePairs.map(lambda currPair : computeJC(currPair, ratedBusinessUsers)).filter(lambda f : f[1] >= 0.055).collect()
  

Как мне изменить вывод записи, чтобы получить нужный формат?

Ответ №1:

Если ваши кортежи остаются в этом формате, вам нужно выполнить некоторый синтаксический анализ строки, чтобы получить идентификаторы из первого элемента кортежа. split это лучший способ сделать это для данного случая. Для вашего текущего формата этот код работает, но вы определенно можете обобщить его для других случаев.

 def fix_tuple(tup):
  ids = tup[0]
  id1 = ids[0].split('"')[-2]
  id2 = ids[1].split('"')[-2]
  return {'b1':id1,'b2':id2,'sim':tup[1]}
  

В действии:

 tup = ((' "business_id": "zPBccKsIHYtLUGFNYIi8Uw"', ' "business_id": "znDUBjt-m2qmXi_p3m3rDA"'), 0.09523809523809523)
print(fix_tuple(tup))
# Output: {'b1': 'zPBccKsIHYtLUGFNYIi8Uw', 'b2': 'znDUBjt-m2qmXi_p3m3rDA', 'sim': 0.09523809523809523}
  

Ответ №2:

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

 x = ((' "business_id": "zPBccKsIHYtLUGFNYIi8Uw"', ' "business_id": "znDUBjt-m2qmXi_p3m3rDA"'), 0.09523809523809523)
yy = {}
yy['b1'] = x[0][0].split(':')[1].strip('" ')
yy['b2'] = x[0][1].split(':')[1].strip('" ')
yy['sim'] = x[1]
  

вы знаете, где в кортежах находятся все члены, поэтому возьмите нужные значения, удалите лишние кавычки и пробелы и упакуйте все это в dict .

Ответ №3:

 import re

KV_RE = re.compile(r'"(?P<key>[^"] )":s*"(?P<value>[^"] )"')
getvalue = lambda kv: match.group("value") if (match := KV_RE.search(kv)) else None

def dict_from_pair(pair):
    ((kv1, kv2), sim) = pair
    return dict(b1=getvalue(kv1), b2=getvalue(kv2), sim=sim)

pair = ((' "business_id": "zPBccKsIHYtLUGFNYIi8Uw"', ' "business_id": "znDUBjt-m2qmXi_p3m3rDA"'), 0.09523809523809523)

print(dict_from_pair(pair))
# {'b1': 'zPBccKsIHYtLUGFNYIi8Uw', 'b2': 'znDUBjt-m2qmXi_p3m3rDA', 'sim': 0.09523809523809523}