Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/314.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python中k,v元组列表中的唯一组合_Python_List_Lambda_Apache Spark_Tuples - Fatal编程技术网

Python中k,v元组列表中的唯一组合

Python中k,v元组列表中的唯一组合,python,list,lambda,apache-spark,tuples,Python,List,Lambda,Apache Spark,Tuples,我有一个元组中各种项目组合的列表 示例=[(1,2)、(2,1)、(1,1)、(1,1)、(2,1)、(2,3,1)、(1,2,3)] 我希望通过独特的组合进行分组和计数 产生结果 result=[((1,2),3),((1,1),2),((2,3,1),2)] 维护顺序或保留组合的哪个排列是非常重要的,但使用lambda函数进行操作是非常重要的,输出格式仍然是元组列表,如上所述,因为我将使用spark RDD对象 我的代码目前使用 RDD=sc.parallelize(示例) 结果=关系图(λ

我有一个元组中各种项目组合的列表

示例=[(1,2)、(2,1)、(1,1)、(1,1)、(2,1)、(2,3,1)、(1,2,3)]

我希望通过独特的组合进行分组和计数

产生结果

result=[((1,2),3),((1,1),2),((2,3,1),2)]

维护顺序或保留组合的哪个排列是非常重要的,但使用lambda函数进行操作是非常重要的,输出格式仍然是元组列表,如上所述,因为我将使用spark RDD对象

我的代码目前使用

RDD=sc.parallelize(示例)
结果=关系图(λ(y):(y,1))\
.reduceByKey(添加)\
.collect()
打印结果


我需要另一个
.map
命令,该命令将添加上述不同排列的帐户

您可以使用
OrderedDict
根据其项目的排序大小写装箱一个已排序字典:

>>> from collections import OrderedDict
>>> d=OrderedDict()
>>> for i in example:
...   d.setdefault(tuple(sorted(i)),i)
... 
('a', 'b')
('a', 'a', 'a')
('a', 'a')
('a', 'b')
('c', 'd')
('b', 'c', 'a')
('b', 'c', 'a')
>>> d
OrderedDict([(('a', 'b'), ('a', 'b')), (('a', 'a', 'a'), ('a', 'a', 'a')), (('a', 'a'), ('a', 'a')), (('c', 'd'), ('c', 'd')), (('a', 'b', 'c'), ('b', 'c', 'a'))])
>>> d.values()
[('a', 'b'), ('a', 'a', 'a'), ('a', 'a'), ('c', 'd'), ('b', 'c', 'a')]

如何:维护一个集合,其中包含您已经看到的每个项目的排序形式。只有在尚未看到其排序形式的情况下,才能将项目添加到结果列表中

example = [ ('a','b'), ('a','a','a'), ('a','a'), ('b','a'), ('c', 'd'), ('b','c','a'), ('a','b','c') ]
result = []
seen = set()
for item in example:
    sorted_form = tuple(sorted(item))
    if sorted_form not in seen:
        result.append(item)
        seen.add(sorted_form)
print result
结果:

[('a', 'b'), ('a', 'a', 'a'), ('a', 'a'), ('c', 'd'), ('b', 'c', 'a')]

由于您正在查找lambda函数,请尝试以下操作:

lambda x, y=OrderedDict(): [a for a in x if y.setdefault(tuple(sorted(a)), a) and False] or y.values()
您可以这样使用此lambda函数:

uniquify = lambda x, y=OrderedDict(): [a for a in x if y.setdefault(tuple(sorted(a)), a) and False] or y.values()
result = uniquify(example)

显然,这牺牲了其他答案的可读性。它基本上在一行丑陋的句子中做着与卡斯拉姆夫德的答案相同的事情。

这与排序的dict相似

from itertools import groupby
ex = [(1,2,3), (3,2,1), (1,1), (2,1), (1,2), (3,2), (2,3,1)]
f = lambda x: tuple(sorted(x)) as key
[tuple(k) for k, _ in groupby(sorted(ex, key=f), key=f)]
有趣的是,您可以得到哪些元组具有相同的组合:

In [16]: example = [ ('a','b'), ('a','a','a'), ('a','a'), ('a', 'a', 'a', 'a'), ('b','a'), ('c', 'd'), ('b','c','a'), ('a','b','c') ]
In [17]: for k, grpr in groupby(sorted(example, key=lambda x: tuple(sorted(x))), key=lambda x: tuple(sorted(x))):
    print k, list(grpr)
   ....:     
('a', 'a') [('a', 'a')]
('a', 'a', 'a') [('a', 'a', 'a')]
('a', 'a', 'a', 'a') [('a', 'a', 'a', 'a')]
('a', 'b') [('a', 'b'), ('b', 'a')]
('a', 'b', 'c') [('b', 'c', 'a'), ('a', 'b', 'c')]
('c', 'd') [('c', 'd')]

根据评论,您实际上似乎需要的是map reduce。我没有安装Spark,但根据文档(请参阅),这必须是这样的:

data.map(lambda i: (frozenset(i), i)).reduceByKey(lambda _, i : i)

但是,如果数据集的
(a,b)、(b,a)
顺序为
(a,b,a)
,则此操作将返回
(b,a)

我解决了自己的问题,但很难理解我到底在寻找什么

example = [(1,2), (1,1,1), (1,1), (1,1), (2,1), (3,4), (2,3,1), (1,2,3)]
RDD = sc.parallelize(example)
result = RDD.map(lambda x: list(set(x)))\
            .filter(lambda x: len(x)>1)\
            .map(lambda(x):(tuple(x), 1))\
            .reduceByKey(add)\
            .collect()
print result

这也消除了简单的重复值,如(1,1)和(1,1,1),这对我有额外的好处

结果顺序重要吗?顺序不重要。什么让你认为使用lambda比简单循环快?至少在Python中是相反的。我需要使用lambda函数来完成它,因为我使用的是带spark RDD的is,我真的不明白这些东西是如何工作的,所以我需要非常小心我传递的数据类型。我会尝试再次更新这个问题听起来像一个问题。你似乎需要一个map reduce之类的东西。快告诉我-这就是我要做的。难道
d.setdefault(tuple(sorted(I)),I)
就足够了吗?甚至
d.setdefault(frozenset(I),I)
@bereal是的,这是个更好的主意!很抱歉,我对python真的很陌生,您能告诉我这将如何在我的列表中使用
示例
您将首先像这样为lambda函数设置一个变量:
uniquify=lambda x,y=OrderedDict():[a代表x中的a如果y.setdefault(tuple(sorted(a)),a)和False]或y.values()
。然后,用列表作为参数调用函数,如下所示:
result=uniquify(示例)
。我已经更新了我的答案以包含这些信息。我只是更新了问题以便更清楚,希望HelpsUp你是对的,这是一个x,y的问题,我用类似的方法解决了它。这是什么协议?我应该发布我的解决方案还是删除我的问题?再次感谢你的帮助,没有这些我是不会解决的suggestions@PeterDoro您删除了一个答案为向上投票的问题。你可以提供自己的答案并接受它,这样人们就会看到这个话题已经结束了。