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!