Как получить элемент из словаря списка - PullRequest
1 голос
/ 23 марта 2020

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

Я объясню тебе мою проблему. У меня есть список в python, и в этом списке у меня есть словарь, подобный этому:

"links": [{"url": "http://catherineingram.com/biography.html", "type": {"key": "/type/link"}, "title": "Biography"}, {"url": "http://www.youtube.com/watch?v=4lJK9cfXP3c", "type": {"key": "/type/link"}, "title": "Interview on Consciousness TV"}, {"url": "http://www.huffingtonpost.com/catherine-ingram/", "type": {"key": "/type/link"}, "title": "Blog on Huffington Post"}]

И моя цель - восстановить 3 элемента URL и поместить его в мою базу данных, и я тоже пытаюсь чтобы восстановить заголовок из 3 элементов и поместить его в мою базу данных

Я попробовал это

for record in csv.DictReader(open(INPUT_FILE, 'r'), fieldnames=COLUMNS, delimiter='\t'):
    j = json.loads(record['json'])

    if 'links' in j:
        for n in j['links']:
            lien.append(n)
        print(lien)
        dico = {"url": lien[(0)]}
        print(dico)

    else:
        links= ''

Здесь входной файл здесь связывает ссылки, которые я вам дал выше.

Поэтому я хотел бы знать, как я могу получить только "url" и "title" из моих ссылок

Результаты о том, что я сделал (мой код, который я показываю вам):

[{'url': 'http://catherineingram.com/biography.html', 'type': {'key': '/type/link'}, 'title': 'Biography'}, {'url': 'http://www.youtube.com/watch?v=4lJK9cfXP3c', 'type': {'key': '/type/link'}, 'title': 'Interview on Consciousness TV'}, {'url': 'http://www.huffingtonpost.com/catherine-ingram/', 'type': {'key': '/type/link'}, 'title': 'Blog on Huffington Post'}]
{'url': {'url': 'http://catherineingram.com/biography.html', 'type': {'key': '/type/link'}, 'title': 'Biography'}}

И мне хотелось бы иметь только эти элементы:

'url': 'http://catherineingram.com/biography.html'
'title': 'Biography'
'url': 'http://www.youtube.com/watch?v=4lJK9cfXP3c'
'title': 'Interview on Consciousness TV'
'url': 'http://www.huffingtonpost.com/catherine-ingram/'
'title': 'Blog on Huffington Post'

Ответы [ 4 ]

2 голосов
/ 23 марта 2020
result = []
for record in csv.DictReader(open(INPUT_FILE, 'r'), fieldnames=COLUMNS, delimiter='\t'):
j = json.loads(record['json'])

if 'links' in j:
    for link in j['links']:
        result.append(link['url'])
        result.append(link['title'])
else:
    links= ''

Вам просто нужно получить доступ к атрибуту текущего элемента массива.

Требуемый вывод довольно странный, вам нужен словарь или простой массив?

Так что, если Вы хотите восстановить словарь, просто следуйте этому коду:

result = []
for record in csv.DictReader(open(INPUT_FILE, 'r'), fieldnames=COLUMNS, delimiter='\t'):
j = json.loads(record['json'])

if 'links' in j:
    for link in j['links']:
        result.append({ 'url': link['url'], 'title': link['title']})
else:
    links= ''
1 голос
/ 23 марта 2020

Я не знаю, действительно ли я понимаю вашу проблему, но если вы просто хотите получить URL-адрес и заголовок, вы можете опустить клавишу "type" и получить остальное:

for item in j['links']:
    item.pop('type', None)
0 голосов
/ 23 марта 2020

@ harens Спасибо за ваш ответ, я попробовал ваш метод и получил его:

[{'url': 'http://catherineingram.com/biography.html', 'type': {'key': '/type/link'}, 'title': 'Biography'}, {'url': 'http://www.youtube.com/watch?v=4lJK9cfXP3c', 'type': {'key': '/type/link'}, 'title': 'Interview on Consciousness TV'}, {'url': 'http://www.huffingtonpost.com/catherine-ingram/', 'type': {'key': '/type/link'}, 'title': 'Blog on Huffington Post'}]

Итак, я получил тип еще, но когда я хотел поместить его в свою базу данных, он ничего не сделал:

@ AntoineFrau

Я тоже попробовал ваш метод и получил:

[{'url': 'http://catherineingram.com/biography.html', 'title': 'Biography'}, {'url': 'http://www.youtube.com/watch?v=4lJK9cfXP3c', 'title': 'Interview on Consciousness TV'}, {'url': 'http://www.huffingtonpost.com/catherine-ingram/', 'title': 'Blog on Huffington Post'}]

Так что он работает идеально, но моя проблема в том, что, когда я пытаюсь поместить его в свою базу данных, как this:

result=[]

    if 'links' in j:
        for link in j['links']:
            result.append({'url': link['url'], 'title': link['title']})
        print(result)
        links=result
    else:
        links = ''

         #   print(n)
            #links_url.append(n['url'])
            #links_title.append(n['title'])
            # links_url.append(n['url'])
            # links_title.append(n['title'])



    c.execute('INSERT INTO AUTHORS VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)',
          [record['key'],
           j.get('name'),
           j.get('eastern_order'),
           j.get('personal_name'),
           j.get('enumeration'),
           j.get('title'),
           bio,
           alternate_names,
           uris,
           j.get('location'),
           j.get('birth_date'),
           j.get('death_date'),
           j.get('date'),
           j.get('wikipedia'),
           links
          ])
db.commit()

Это дает мне ошибку в ссылках:

 line 63, in <module>
    c.execute('INSERT INTO AUTHORS VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)',
sqlite3.InterfaceError: Error binding parameter 14 - probably unsupported type.

Я пытаюсь поместить URL и заголовок в моей базе данных в сущности "links"

Спасибо за ваш ответ еще раз!

0 голосов
/ 23 марта 2020

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

Вместо этого он даст следующее:

{
    "url": [
        "http://catherineingram.com/biography.html",
        "http://www.youtube.com/watch?v=4lJK9cfXP3c",
        "http://www.huffingtonpost.com/catherine-ingram/",
    ],
    "title": ["Biography", "Interview on Consciousness TV", "Blog on Huffington Post"],
}

Однако, если вы хотите напечатать результаты, то это будет просто:

# Original results
results = [{'url': 'http://catherineingram.com/biography.html',
  'type': {'key': '/type/link'},
  'title': 'Biography'},
 {'url': 'http://www.youtube.com/watch?v=4lJK9cfXP3c',
  'type': {'key': '/type/link'},
  'title': 'Interview on Consciousness TV'},
 {'url': 'http://www.huffingtonpost.com/catherine-ingram/',
  'type': {'key': '/type/link'},
  'title': 'Blog on Huffington Post'}]

# Each item in the list is a dictionary
for dict in results:
    for item in dict:
        # We only want urls and titles
        if item != 'type':
            print(f"{item}: {dict[item]}")

# OUTPUT
# url: http://catherineingram.com/biography.html
# title: Biography
# url: http://www.youtube.com/watch?v=4lJK9cfXP3c
# title: Interview on Consciousness TV
# url: http://www.huffingtonpost.com/catherine-ingram/
# title: Blog on Huffington Post
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...