Python 从字典中长度不等的元素形成元组列表

Python 从字典中长度不等的元素形成元组列表,python,list,dictionary,Python,List,Dictionary,我有一本长度不等的字典 例如: d= {'190': ['229'], '192': ['205'], '193': ['259'], '194': ['196', '204', '242', '249', '254', '266', '299', '302', '346'], '195': ['218', '273', '275', '306', '328'], '196': ['204', '249', '254', '266', '285', '330', '346'], '197': [

我有一本长度不等的字典

例如:

d= {'190': ['229'], '192': ['205'], '193': ['259'], '194': ['196', '204', '242', '249', '254', '266', '299', '302', '346'], '195': ['218', '273', '275', '306', '328'], '196': ['204', '249', '254', '266', '285', '330', '346'], '197': ['251', '272', '281', '284', '309', '320', '329'], '198': ['348', '351', '364', '393', '399', '441', '476', '501', '549', '564'], '199': ['200', '203', '211', '212', '222', '223', '231', '232', '238', '239', '252', '261', '265', '271', '288', '291', '298', '304', '313', '314', '315', '322', '324', '325', '342'], '200': ['203', '223', '224', '232', '236', '239', '248', '252', '271', '274', '276', '277', '280', '285', '297', '304', '322', '323', '324', '325', '332', '334'], '201': ['259'], '202': ['329'], '203': ['211', '223', '238', '239', '261', '265', '268', '270', '271', '272']}
我想在字典中创建这些值的元组列表

我用来创建的示例代码是:

for k, v in d.items():
    #print(list(zip(v[::1], v[1::2])))

    if len(v) == 5:
        it = iter(v)
        print(len(v))
        print(v)
        print(list(zip(it, it)))
产生

['218', '273', '275', '306', '328']
[('218', '273'), ('275', '306')]
但我理想的目标是:

[('218', '273'), ('273', '275'), ('275', '306'), ('306', '328')]

我在这个迭代中遗漏了什么?我用它作为一个例子,但我希望能够有
len(v)=1的字典值,例如一个
'190':['229']
,它也会导致
('229',)
。如果
len(v)==1
很难实现,我很好
len(v)>1
建议

使用同一迭代器两次,因此这意味着原始列表中的每个值都会产生一次

例如,您可以使用
itertools
islice
,以引用列表及其“尾部”。在列表长度为1的情况下,将该值包装在单元组中可能是最简单的方法:

from itertools import islice

for k, v in d.items():
    if len(v) > 1:
        print(list(zip(it, islice(v, 1, None))))
    elif len(v) == 1:
        print([(v[0],)])
从itertools导入islice
对于d.项()中的k,v:
如果len(v)>1:
打印(列表(zip(it、islice(v、1、无)))
elif len(v)==1:

print([(v[0],)])
您使用同一迭代器两次,因此这意味着原始列表中的每个值都生成一次

例如,您可以使用
itertools
islice
,以引用列表及其“尾部”。在列表长度为1的情况下,将该值包装在单元组中可能是最简单的方法:

from itertools import islice

for k, v in d.items():
    if len(v) > 1:
        print(list(zip(it, islice(v, 1, None))))
    elif len(v) == 1:
        print([(v[0],)])
从itertools导入islice
对于d.项()中的k,v:
如果len(v)>1:
打印(列表(zip(it、islice(v、1、无)))
elif len(v)==1:

打印([(v[0],)])
我发现了另一种方法,您可以用更少的代码实现这一点:

tuples_list = [] #The list where we are going to save the tuples

#We iterate the values and we convert each list into a tuple
for sublist in d.values():
    tuples_list.append(tuple(sublist))

这样,您就不必担心每个列表的长度。您可以毫无问题地将列表转换为元组。

我找到了另一种方法,您可以用更少的代码实现这一点:

tuples_list = [] #The list where we are going to save the tuples

#We iterate the values and we convert each list into a tuple
for sublist in d.values():
    tuples_list.append(tuple(sublist))

这样,您就不必担心每个列表的长度。您可以毫无问题地将列表转换为元组。

这似乎是您想要的:

在所有情况下

理解:

result = {}

for k, v in d.items():
    indexes = [i for i, b in enumerate(v)]
    result[k] = [(v[i], v[i + 1]) for i in indexes[:-1]] if len(v) > 1 else [(v[0],)]

print(result)
或者如果——否则:

result = {}

for k, v in d.items():
    indexes = [i for i, b in enumerate(v)]
    if len(v) > 1:
        result[k] = [(v[i], v[i + 1]) for i in indexes[:-1]]
    else:
        result[k] = [(v[0],)]

print(result)
对于您的情况(=5):


这似乎是你想要的:

在所有情况下

理解:

result = {}

for k, v in d.items():
    indexes = [i for i, b in enumerate(v)]
    result[k] = [(v[i], v[i + 1]) for i in indexes[:-1]] if len(v) > 1 else [(v[0],)]

print(result)
或者如果——否则:

result = {}

for k, v in d.items():
    indexes = [i for i, b in enumerate(v)]
    if len(v) > 1:
        result[k] = [(v[i], v[i + 1]) for i in indexes[:-1]]
    else:
        result[k] = [(v[0],)]

print(result)
对于您的情况(=5):


这里不应该两次使用同一迭代器。您可以使用itertools中的
islice
,并使用
list(zip(v,islice(v,1,None))
。此处不应使用同一迭代器两次。您可以使用itertools中的
islice
,并使用
list(zip(v,islice(v,1,None))
。我在玩enumerate,这解决了问题。谢谢apet!我在玩enumerate,这解决了问题。谢谢apet!