Python 更智能的数据收集方式或数据排序方式

Python 更智能的数据收集方式或数据排序方式,python,dictionary,Python,Dictionary,我使用snip1从sqlite表中提取数据,这当然会获取包含相关id值的每一行。services列表现在看起来像output1 我希望能够将元组列表排序为更易于管理的数据集。合并所有相关的id集。 例如[(10,u'80'),(10,u'443')]变成{10:80443},当然,所有其他条目都添加到同一目录中 我很难对数据进行排序。如何比较同一列表中的项目?下面的example1显示了已清理的数据,但我不确定如何从中获得一个干净的字典 snip1 c.execute('SELECT * FRO

我使用
snip1
从sqlite表中提取数据,这当然会获取包含相关
id
值的每一行。
services
列表现在看起来像
output1

我希望能够将元组列表排序为更易于管理的数据集。合并所有相关的id集。 例如
[(10,u'80'),(10,u'443')]
变成
{10:80443}
,当然,所有其他条目都添加到同一
目录中

我很难对数据进行排序。如何比较同一列表中的项目?下面的
example1
显示了已清理的数据,但我不确定如何从中获得一个干净的字典

snip1

c.execute('SELECT * FROM services WHERE id=?', (id_value,))
services = c.fetchall()
[[(2, u'22')], [(3, u'25')], [(4, u'443')], [(5, u'443')], [(6, u'443')], [(7, u'22')], 
[(8, u'80')], [(9, u'443')], [(10, u'80'), (10, u'443')], [(11, u'80'), (11, u'443')], 
[(12, u'80'), (12, u'443')], [(13, u'443')], [(14, u'80'), (14, u'443')], [(15, u'25')]]
data = [(2, u'22')], [(3, u'25')], [(4, u'443')], [(5, u'443')], [(6, u'443')], [(7, u'22')], 
    [(8, u'80')], [(9, u'443')], [(10, u'80'), (10, u'443')], [(11, u'80'), (11, u'443')], 
    [(12, u'80'), (12, u'443')], [(13, u'443')], [(14, u'80'), (14, u'443')], [(15, u'25')]]

for item in data:
    for i in item:
        print i  #output2
输出1

c.execute('SELECT * FROM services WHERE id=?', (id_value,))
services = c.fetchall()
[[(2, u'22')], [(3, u'25')], [(4, u'443')], [(5, u'443')], [(6, u'443')], [(7, u'22')], 
[(8, u'80')], [(9, u'443')], [(10, u'80'), (10, u'443')], [(11, u'80'), (11, u'443')], 
[(12, u'80'), (12, u'443')], [(13, u'443')], [(14, u'80'), (14, u'443')], [(15, u'25')]]
data = [(2, u'22')], [(3, u'25')], [(4, u'443')], [(5, u'443')], [(6, u'443')], [(7, u'22')], 
    [(8, u'80')], [(9, u'443')], [(10, u'80'), (10, u'443')], [(11, u'80'), (11, u'443')], 
    [(12, u'80'), (12, u'443')], [(13, u'443')], [(14, u'80'), (14, u'443')], [(15, u'25')]]

for item in data:
    for i in item:
        print i  #output2
示例1

c.execute('SELECT * FROM services WHERE id=?', (id_value,))
services = c.fetchall()
[[(2, u'22')], [(3, u'25')], [(4, u'443')], [(5, u'443')], [(6, u'443')], [(7, u'22')], 
[(8, u'80')], [(9, u'443')], [(10, u'80'), (10, u'443')], [(11, u'80'), (11, u'443')], 
[(12, u'80'), (12, u'443')], [(13, u'443')], [(14, u'80'), (14, u'443')], [(15, u'25')]]
data = [(2, u'22')], [(3, u'25')], [(4, u'443')], [(5, u'443')], [(6, u'443')], [(7, u'22')], 
    [(8, u'80')], [(9, u'443')], [(10, u'80'), (10, u'443')], [(11, u'80'), (11, u'443')], 
    [(12, u'80'), (12, u'443')], [(13, u'443')], [(14, u'80'), (14, u'443')], [(15, u'25')]]

for item in data:
    for i in item:
        print i  #output2
输出2

(2, u'22')
(3, u'25')
(4, u'443')
(5, u'443')
(6, u'443')
(7, u'22')
(8, u'80')
(9, u'443')
(10, u'80')
(10, u'443')
(11, u'80')
(11, u'443')
(12, u'80')
(12, u'443')
(13, u'443')
(14, u'80')
(14, u'443')
(15, u'25')

您可以使用
dict
list
理解来完成这一操作

>>> data = [[(2, u'22')], [(3, u'25')], [(4, u'443')], [(5, u'443')], [(6, u'443')], [(7, u'22')], 
    [(8, u'80')], [(9, u'443')], [(10, u'80'), (10, u'443')], [(11, u'80'), (11, u'443')], 
    [(12, u'80'), (12, u'443')], [(13, u'443')], [(14, u'80'), (14, u'443')], [(15, u'25')]]
>>> output = {record[0][0]: [int(item[1]) for item in record] for record in data}
>>> output
{2: [22],
 3: [25],
 4: [443],
 5: [443],
 6: [443],
 7: [22],
 8: [80],
 9: [443],
 10: [80, 443],
 11: [80, 443],
 12: [80, 443],
 13: [443],
 14: [80, 443],
 15: [25]}

要将元组列表转换为字典,请执行以下操作:

    list = [(10, u'80'), (10, u'443')]
    dict = {}

    for (i, j) in list:
        dict.setdefault(i, []).append(j)
这将为您提供:

    >>> dict
    {10: [u'80', u'443']}
然后,您可以使用pprint以便于比较字典项的方式进行打印

    import pprint
    pprint.pprint(dict)

这个例子只有一个键,但pprint会为每个键创建一个新行,与上面的键类似。

{10:80443}
中没有任何意义,你的意思是
{10:[80443]}
?抱歉,我指的是带有键及其相关值的
dict
。是的,如果这是正确的格式。这个练习的目的是什么?你的意思是什么?我会将数据集与新数据进行比较,如果不匹配,会进行更新。谢谢大家,这就是我喜欢编码的原因。给这只猫剥皮总是有不同的方法:)。我发现vishes_shell的答案是最激动人心的,所以我选择了它作为正确的答案。谢谢调用变量
dict
list
是个坏主意。如果您打算对字典值使用默认值,最好使用
collections.defaultdict
数据类型。