如何使用单个列表创建词典?

2024-04-20 01:01:25 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一份来自我国一家报纸网站的网址和标题列表。一般来说:

x = ['URL1','news1','news2','news3','URL2','news1','news2','URL3','news1']

每个URL元素都有相应的“news”元素序列,这些元素的长度可能不同。在上面的例子中,URL1有3个对应的新闻,URL3只有一个。在

有时URL没有相应的“news”元素:

^{pr2}$

我可以很容易地找到每个URL索引和每个URL的“news”元素。在

我的问题是:是否可以将这个列表转换成一个以URL元素为键,“news”元素是list/tuple值的字典吗?

预期输出

z = {'URL1':('news1', 'news2', 'news3'),
     'URL2':('news1', 'news2'),
     'URL3':('news1'),
     'URL4':('news1', 'news2'),
     'URL5':(),
     'URL6':('news1')}

我在这个post中看到过类似的问题,但它并不能解决我的问题。在


Tags: url元素标题列表网站序列news网址
3条回答

你可以这样做:

>>> y = ['URL4','news1','news2','URL5','URL6','news1']
>>> result = {}
>>> current_url = None
>>> for entry in y:
...     if entry.startswith('URL'):
...         current_url = entry
...         result[current_url] = ()
...     else:
...         result[current_url] += (entry, )
...         
>>> result
{'URL4': ('news1', 'news2'), 'URL5': (), 'URL6': ('news1',)}

您只需使用列表中URL键的索引并获取索引之间的内容并将其分配给第一个

像这样:

x = ['URL1','news1','news2','news3','URL2','news1','news2','URL3','news1']
urls = [x.index(y) for y in x if 'URL' in y]
adict = {}
for i in range(0, len(urls)):
    if i == len(urls)-1:
        adict[x[urls[i]]] = x[urls[i]+1:len(x)]
    else:
        adict[x[urls[i]]] = x[urls[i]+1:urls[i+1]]
print(adict)

输出:

^{pr2}$

您可以使用itertools.groupbykey函数来标识URL:

from itertools import groupby
def _key(url):
    return url.startswith("URL") #in the body of _key, write code to identify a URL

data = ['URL1','news1','news2','news3','URL2','news1','news2','URL3','news1', 'URL4','news1','news2','URL5','URL6','news1']
new_d = [list(b) for _, b in groupby(data, key=_key)]
grouped = [[new_d[i], tuple(new_d[i+1])] for i in range(0, len(new_d), 2)]
result = dict([i for [*c, a], b in grouped for i in [(i, ()) for i in c]+[(a, b)]])

输出:

^{pr2}$

相关问题 更多 >