Python中的列表(list),元组(tuple),集合(set),字典(dict)


Python中列表(list)、字典(dict)、集合(set) 数据排序

参考链接:http://ciniao.me/article.php?id=8

对字符串列表进行就地排序
list_str = [‘blue’,’allen’,’sophia’,’keen’]
print list_str
list_str.sort()
print list_str

#执行结果:
[‘blue’, ‘allen’, ‘sophia’, ‘keen’]

[‘allen’, ‘blue’, ‘keen’, ‘sophia’]

====

对整型数进行排序
list_int = [34,23,2,2333,45]
print list_int
list_int.sort()
print list_int

#执行结果:
[34, 23, 2, 2333, 45]

[2, 23, 34, 45, 2333]

====

对字典数据进行排序(对字典进行排序需要使用sorted()方法)
dict_str = {‘blue’:’[email protected]’,
                ‘allen’:’[email protected]’,
                ‘sophia’:’[email protected]’,
                ‘ceen’:’[email protected]’}
print dict_str
按照key进行排序
print sorted(dict_str.items(), key=lambda d: d[0])   
按照value进行排序
print sorted(dict_str.items(), key=lambda d: d[1])

#执行结果:
{‘blue’: ‘[email protected]’, ‘allen’: ‘[email protected]’, ‘sophia’: ‘[email protected]’, ‘ceen’: ‘[email protected]’}

[(‘allen’, ‘[email protected]’), (‘blue’, ‘[email protected]’), (‘ceen’, ‘[email protected]’),(‘sophia’, ‘[email protected]’)]

[(‘allen’, ‘[email protected]’), (‘sophia’, ‘[email protected]’), (‘blue’, ‘[email protected]’), (‘ceen’, ‘[email protected]’)]

====

对集合排序

data = set([‘booklet’, ‘4 sheets’, ’48 sheets’, ’12 sheets’])
r = sorted(data, key=lambda item: (int(item.partition(‘ ‘)[0]) if item[0].isdigit() else float(‘inf’), item))
print ‘,n’.join(r)

4 sheets,
12 sheets,
48 sheets,
booklet

原文参见http://stackoverflow.com/questions/2669059/how-to-sort-alpha-numeric-set-in-python

=========================================================

来个复杂点的例子:

对list进行排序,list的元素是一个含有三个数字的list,排序规则如下:
第一位升排序
若第一位相同,第二位降排序
若第二位也相同,第三位升排序
提示:可以用sort方法
例:
排序前
alist=[[1,2,3],[2,3,1],[1,3,2],[1,3,4],[1,2,1]]
排序后
Alist=[[1,3,2],[1,3,4],[1,2,1],[1,2,3],[2,3,1]]

代码如下:
#!/usr/bin/env python
# -*- coding: utf-8 -*-
alist=[[1,2,3],[2,3,1],[1,3,2],[1,3,4],[1,2,1]]
Alist = sorted(alist)
print Alist
b = sorted(Alist,cmp = lambda x, y: -cmp(x[1], y[1]))
print b
c = sorted(b, key = lambda z: z[0])
print c
原文地址:

python中列表(list)、字典(dict)、集合(set) 数据排序


Python两个 list 获取交集,并集,差集的方法
有时候,为了需求,需要统计两个 list 之间的交集,并集,差集。查询了一些资料,现在总结在下面:
1.获取两个 list 的交集
#方法一
a=[2,3,4,5]
b=[2,5,8]
tmp = [val for val in a if val in b]    #生成列表
print tmp
#[2, 5]
#方法二
print list(set(a).intersection(set(b)))
2.获取两个 list 的并集
print list(set(a).union(set(b)))
3.获取两个 list 的差集
print list(set(b).difference(set(a))) # b中有而a中没有的

通过以上方法,就能处理 python list 的交集,并集,差集了。

Python对list去重的各种方法
今天遇到一个问题,在各种搜索之后,知道了 itertools.groupby 这个函数。问题是对一个list中的新闻id进行去重,去重之后要保证顺序不变
直观方法

最简单的思路就是:

ids = [1,2,3,3,4,2,3,4,5,6,1]
news_ids = []
for id in ids:
    if id not in news_ids:
        news_ids.append(id)

print news_ids

这样也可行,但是看起来不够Pythonic。

用set

另外一个解决方案就是用set:

ids = [1,4,3,3,4,2,3,4,5,6,1]
ids = list(set(ids))

这样的结果是没有保持原来的顺序

按照索引再次排序(为了保持原来的顺序)

最后通过这种方式解决:

ids = [1,4,3,3,4,2,3,4,5,6,1]
news_ids = list(set(ids))
news_ids.sort(ids.index)
使用itertools.grouby

文章一开始就提到itertools.grouby, 如果不考虑列表顺序的话可用这个:

ids = [1,4,3,3,4,2,3,4,5,6,1]
ids.sort()
it = itertools.groupby(ids)

for k, g in it:
    print k

关于itertools.groupby的原理可以看这里:http://docs.python.org/2/library/itertools.html#itertools.groupby

网友补充:用reduce

网友reatlk留言给了另外的解决方案。我补充并解释到这里:

>> ids = [1,4,3,3,4,2,3,4,5,6,1]
>> func = lambda x,y:x if y in x else x + [y]
>> reduce(func, [[], ] + ids)

Output: [1, 4, 3, 2, 5, 6]

上面是我在ipython中运行的代码,其中的 lambda x,y:x if y in x else x + [y] 等价于 lambda x,y: y in x and x or x+[y] 。

思路其实就是先把ids变为[[], 1,4,3,……] ,然后在利用reduce的特性。reduce解释参看这里:http://docs.python.org/2/library/functions.html#reduce

=================

字典(dict)

dict 用 {} 包围
dict.keys(),dict.values(),dict.items()
hash(obj)返回obj的哈希值,如果返回表示可以作为dict的key
del 或 dict.pop可以删除一个item,clear清除所有的内容
sorted(dict)可以把dict排序
dict.get()可以查找没存在的key,dict.[]不可以
dict.setdefault() 检查字典中是否含有某键。如果字典中这个键存在,你可以取到它的值。 如果所找的键在字典中不存在,你可以给这个键赋默认值并返回此值。
{}.fromkeys()创建一个dict,例如: {}.fromkeys((‘love’, ‘honor’), True) =>{‘love’: True, ‘honor’: True}
不允许一个键对应多个值
键值必须是哈希的,用hash()测试
一个对象,如果实现_hash()_方法可以作为键值使用

集合(set)
集合是一个数学概念,用set()创建
set.add(), set.update(), set.remove(),添加更新删除,-= 可以做set减法
set.discard 和 set.remove不同在于如果删除的元素不在集合内,discard不报错,remove 报错
< <= 表示 子集,> >=表示超集
| 表示联合 & 表示交集 – 表示差集 ^ 差分集

列表(list)
列表是序列对象,可包含任意的Python数据信息,如字符串、数字、列表、元组等。列表的数据是可变的,我们可通过对象方法对列表中的数据进行增加、修改、删除等操作。可以通过list(seq)函数把一个序列类型转换成一个列表。
append(x) 在列表尾部追加单个对象x。使用多个参数会引起异常。
count(x) 返回对象x在列表中出现的次数。
extend(L) 将列表L中的表项添加到列表中。返回None。
Index(x) 返回列表中匹配对象x的第一个列表项的索引。无匹配元素时产生异常。
insert(i,x) 在索引为i的元素前插入对象x。如list.insert(0,x)在第一项前插入对象。返回None。
pop(x) 删除列表中索引为x的表项,并返回该表项的值。若未指定索引,pop返回列表最后一项。
remove(x) 删除列表中匹配对象x的第一个元素。匹配元素时产生异常。返回None。
reverse() 颠倒列表元素的顺序。
sort() 对列表排序,返回none。bisect模块可用于排序列表项的添加和删除。
元组(tuple)
tuple=(1,),这是单个元素的元组表示,需加额外的逗号。
tuple=1,2,3,4,这也可以是一个元组,在不使用圆括号而不会导致混淆时,Python允许不使用圆括号的元组。
和列表一样,可对元组进行索引、分片、连接和重复。也可用len()求元组长度。
元组的索引用tuple[i]的形式,而不是tuple(i)。
和列表类似,使用tuple(seq)可把其它序列类型转换成元组。
说明:这篇文章是从网上搜集到的几篇文章合成而成,中间的那部分原文地址忘了出处了,有机会再补上。


可以参见后来在看书的过程中了解到的一些知识笔记:http://ixyzero.com/blog/archives/1284.html

《 “Python中的列表(list),元组(tuple),集合(set),字典(dict)” 》 有 13 条评论

  1. 在Python中如何将dict转换成字符串进行处理

    方法一:使用json模块
    `
    import json

    # convert to string
    input = json.dumps({‘id’: id })

    # load to dict
    my_dict = json.loads(input)
    `
    方法二:用str和eval
    `
    dict1 = {‘one’:1, ‘two’:2, ‘three’: {‘three.1’: 3.1, ‘three.2’: 3.2 }}
    str1 = str(dict1)
    dict2 = eval(str1)
    print dict1 == dict2
    `
    方法三:针对单层dict
    `
    ‘, ‘.join([‘ : ‘.join((k, str(keywordsList[k]))) for k in sorted(keywordsList, key=keywordsList. get, reverse=True)])
    `
    参考链接:
    http://stackoverflow.com/questions/4547274/convert-a-python-dict-to-a-string-and-back
    http://stackoverflow.com/questions/18232524/python-dict-to-string
    http://www.cnblogs.com/end/archive/2012/03/30/2425977.html
    http://stackoverflow.com/questions/988228/convert-a-string-representation-of-a-dictionary-to-a-dictionary
    http://smilejay.com/2014/10/convert_string_to_dict_python/

  2. Python中的 set 的使用 # http://www.jianshu.com/p/de4af954fcbe
    Python集合(set)类型的操作 # http://blog.csdn.net/business122/article/details/7541486
    https://docs.python.org/2/library/stdtypes.html#set
    `
    # 创建 set
    # 创建 set 的方式是调用 set() 并传入一个 list,list的元素将作为set的元素
    s = set([‘Adam’, ‘Lisa’, ‘Bart’, ‘Paul’])

    # 访问set
    # 由于set存储的是无序集合,所以我们没法通过索引来访问。所以,访问 set中的某个元素实际上就是判断一个元素是否在set中。
    print ‘Bart’ in s

    # 更新set
    if name in s:
    s.remove(name)
    else:
    s.add(name)
    `

  3. Python中如何将一个内容实际为list的字符串转换成真正的list类型? (Convert string representation of list to list in Python)
    https://stackoverflow.com/questions/1894269/convert-string-representation-of-list-to-list-in-python
    https://stackoverflow.com/questions/10775894/converting-a-string-representation-of-a-list-into-an-actual-list-object

    `
    >>> import ast
    >>> x = u'[ “A”,”B”,”C” , ” D”]’
    >>> x = ast.literal_eval(x)
    >>> x
    [‘A’, ‘B’, ‘C’, ‘ D’]

    # 或

    >>> import json
    >>> x = u'[ “A”,”B”,”C” , ” D”]’
    >>> json.loads(x)
    [u’A’, u’B’, u’C’, u’ D’]
    `

  4. Python中list,tuple,dict,set的区别和用法
    https://www.cnblogs.com/soaringEveryday/p/5044007.html
    `
    #Python中set变量的初始化是通过给set()传递一个list类型的变量(或者不传)来实现的,不接受如下形式:
    >>> s = set(‘A’, ‘B’, ‘C’) #错误
    TypeError: set expected at most 1 arguments, got 3

    >>> s = set([‘A’, ‘B’, ‘C’]) #正确
    >>> s.add(4)
    >>> print s
    set([‘A’, ‘C’, ‘B’, 4])
    `

  5. Python中如何检测一个变量的类型是否为 list/dict/tuple ?
    https://stackoverflow.com/questions/26544091/checking-if-type-list-in-python
    `
    In [144]: test_object = ‘str’
    …: if isinstance(test_object, (list,)): print ‘type(test_object) is list’
    …:

    In [145]: type(test_object)
    Out[145]: str

    In [146]: test_object = []
    …: if isinstance(test_object, (list,)): print ‘type(test_object) is list’
    …:
    type(test_object) is list

    In [147]: type(test_object)
    Out[147]: list

    In [148]: test_object = {}
    …: if isinstance(test_object, (dict,)): print ‘type(test_object) is dict’
    …:
    type(test_object) is dict

    In [149]: type(test_object)
    Out[149]: dict

    In [150]: test_object = ()
    …: if isinstance(test_object, (tuple,)): print ‘type(test_object) is tuple’
    …:
    type(test_object) is tuple

    In [151]: type(test_object)
    Out[151]: tuple
    `

  6. TypeError: unhashable type: ‘list’
    https://blog.csdn.net/you_are_my_dream/article/details/61616646
    `
    Python不支持dict的key为list或dict类型,因为list和dict类型是unhashable(不可哈希)的。

    Python中 list 类型的值不可哈希;创建 set 类型值时,输入不能使用包含 unhashable 类型的 list。

    In [38]: s = set(range(1, 10))

    In [39]: s
    Out[39]: {1, 2, 3, 4, 5, 6, 7, 8, 9}

    In [40]: li = range(1, 11)

    In [41]: li
    Out[41]: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

    In [42]: li.append(range(1, 11))

    In [43]: li
    Out[43]: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]]

    In [44]: s = set(li)
    —————————————————————————
    TypeError Traceback (most recent call last)
    in ()
    —-> 1 s = set(li)

    TypeError: unhashable type: ‘list’

    In [48]: li3 = range(1, 11)

    In [49]: li3.extend(range(1, 11))

    In [50]: li3
    Out[50]: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

    In [51]: ss = set(li3)

    In [52]: ss
    Out[52]: {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}
    `

  7. Python中如何将一个 list 类型的元素添加到 set 中去?
    https://stackoverflow.com/questions/1306631/python-add-list-to-set
    `
    Python中不能直接将 list 添加到 set 中,因为 list 是可变的,意味着你可以在将其添加到 set 之后改变它的内容。
    但是你可以将 tuple 添加到 set 中,因为 tuple 是不可变的。
    `

    Python中如何向 set 添加元素?
    https://stackoverflow.com/questions/3392354/append-values-to-a-set-in-python/31972583#31972583
    `
    a = set()
    # 添加单个元素
    a.add(1)
    a.add(2) # {1, 2}
    # 向SET中添加可迭代(iterable)类型变量包含的元素
    a.update([3,4]) # {1, 2, 3, 4}
    `

  8. Python中如何在遍历一个 dict 的过程中删除部分元素?
    How to delete items from a dictionary while iterating over it?
    https://stackoverflow.com/questions/5384914/how-to-delete-items-from-a-dictionary-while-iterating-over-it
    `
    val = 3
    mydict = {‘one’: 1, ‘two’: 2, ‘three’: 3, ‘four’: 4}
    print mydict

    # 方法一
    # 将遍历删除过程分成 2 步进行
    remove = [k for k in mydict if k == val]
    for k in remove: del mydict[k]

    # 方法二
    # Python 2.7 and 3.x
    mydict = { k:v for k,v in mydict.items() if k!=val }
    # before Python 2.7
    mydict = dict((k,v) for k,v in mydict.iteritems() if k!=val)
    `

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注