在Python中,我有一个元组列表和一个长度相同的整数列表,例如,
a = [
[1, 2],
[3, 2],
[4, 66],
[2, 3]
]
b = [
1,
31,
31,
44
]
a
中的第k个条目可以被认为与b
中的第k个条目相关联。
条目[3, 2]
和[2, 3]
对我来说真的是一样的,我希望a
在考虑之后不会对此有所了解。另外,我想要一个属于新唯一列表的条目列表。对于上面的例子,
a2 = [
[1, 2],
[3, 2], # or [2, 3]
[4, 66]
]
b2 = [
[1],
[31, 44],
[31]
]
b2[0]
为[1]
,因为[1, 2]
仅与1
相关联。 b2[1]
为[31, 44]
,因为[2, 3]
(等于[3, 2]
与31
中的44
和a
相关联。
可以通过条目遍历a
条目,使每个2列表成为冻结集,将其排序为字典等。不用说,如果a
和b
并不是很好sqlite3
很大。
有关如何处理这种智慧的任何提示? (列表理解?)
答案 0 :(得分:5)
如果您想维护订单和组,我认为您不会比使用 OrderedDict 进行分组更好:
from collections import OrderedDict
a = [
[1, 2],
[3, 2],
[4, 66],
[2, 3]
]
b = [1, 31, 31, 44]
d = OrderedDict()
for ind, f in enumerate(map(frozenset, a)):
d.setdefault(f, []).append(b[ind])
print(list(d), list(d.values()))
哪会给你:
[frozenset({1, 2}), frozenset({2, 3}), frozenset({66, 4})] [[1], [31, 44], [31]]
如果看到的订单无关紧要,请使用 defaultdict :
from collections import defaultdict
a = [
[1, 2],
[3, 2],
[4, 66],
[2, 3]
]
b = [1, 31, 31, 44]
d = defaultdict(list)
for ind, f in enumerate(map(frozenset, a)):
d[f].append(b[ind])
print(list(d), list(d.values()))
哪会给你:
[frozenset({1, 2}), frozenset({2, 3}), frozenset({66, 4})] [[1], [31, 44], [31]]
如果你真的想要列表或元组:
print(list(map(list, d)), list(d.values()))
哪会给你:
[[1, 2], [2, 3], [66, 4]] [[1], [31, 44], [31]]
对于python2,您应该使用itertools.izip
和itertools.imap
代替map和zip。
答案 1 :(得分:1)
对于:
a = [
[1, 2],
[3, 2],
[4, 66],
[2, 3]
]
a_set = {frozenset(i) for i in a}
a2 = list(list(i) for i in a_set)
print(a2)
# -> [[66, 4], [1, 2], [2, 3]]
不确定你在寻找b。
编辑:这更有意义。 @ PadraicCunningham的回答是正确的。