折叠Python列表,保留唯一列和最高值
我有一份清单折叠Python列表,保留唯一列和最高值,python,python-2.7,list,pandas,Python,Python 2.7,List,Pandas,我有一份清单 data = [ ['fruit', 'apple', 'v1', 'data 1'], ['fruit', 'apple', 'v2', 'data 2'], ['fruit', 'apple', 'v3', 'data 3'], ['fruit', 'banana', 'v1', 'data 4'], ['fruit', 'banana', 'v2', 'data 5'], ['anima
data = [ ['fruit', 'apple', 'v1', 'data 1'],
['fruit', 'apple', 'v2', 'data 2'],
['fruit', 'apple', 'v3', 'data 3'],
['fruit', 'banana', 'v1', 'data 4'],
['fruit', 'banana', 'v2', 'data 5'],
['animal', 'dog', 'v1', 'data 6'] ]
如何基于前2列并使用来自最高v的数据进行折叠
result = [ ['fruit', 'apple', 'v3', 'data 3'],
['fruit', 'banana', 'v2', 'data 5'],
['animal', 'dog', 'v1', 'data 6'] ]
列表已在第一列中排序,但第二列未排序。我的解决方案是基于这样一个假设,即两列都已排序,所以它不起作用,我不知道从这里可以走到哪里
previous = []
result = []
for a, b, c, d in data:
if not all(x in previous for x in [a, b]):
final.append([a, b, c, d])
previous = [a, b, c, d]
else:
if previous[2] < c:
final[-1][2] = c
final[-1][3] = d
previous = [a, b, c, d]
print result
这是一种方式
import pandas as pd
data = [ ['fruit', 'apple', 'v1', 'data 1'],
['fruit', 'apple', 'v2', 'data 2'],
['fruit', 'apple', 'v3', 'data 3'],
['fruit', 'banana', 'v1', 'data 4'],
['fruit', 'banana', 'v2', 'data 5'],
['animal', 'dog', 'v1', 'data 6'] ]
df = pd.DataFrame(data, columns=['Col1', 'Col2', 'Col3', 'Col4'])
df['Grouper'] = df['Col1'] + df['Col2']
df['Order'] = df['Col3'].map(lambda x: int(x[-1]))
df = df.sort_values(['Grouper', 'Order'], ascending=[True, False])\
.drop_duplicates('Grouper')\
.drop(['Grouper', 'Order'], 1)
lst = df.values.tolist()
# [['animal', 'dog', 'v1', 'data 6'],
# ['fruit', 'apple', 'v3', 'data 3'],
# ['fruit', 'banana', 'v2', 'data 5']]
这是一种方式
import pandas as pd
data = [ ['fruit', 'apple', 'v1', 'data 1'],
['fruit', 'apple', 'v2', 'data 2'],
['fruit', 'apple', 'v3', 'data 3'],
['fruit', 'banana', 'v1', 'data 4'],
['fruit', 'banana', 'v2', 'data 5'],
['animal', 'dog', 'v1', 'data 6'] ]
df = pd.DataFrame(data, columns=['Col1', 'Col2', 'Col3', 'Col4'])
df['Grouper'] = df['Col1'] + df['Col2']
df['Order'] = df['Col3'].map(lambda x: int(x[-1]))
df = df.sort_values(['Grouper', 'Order'], ascending=[True, False])\
.drop_duplicates('Grouper')\
.drop(['Grouper', 'Order'], 1)
lst = df.values.tolist()
# [['animal', 'dog', 'v1', 'data 6'],
# ['fruit', 'apple', 'v3', 'data 3'],
# ['fruit', 'banana', 'v2', 'data 5']]
您可以使用:
-根据前2个值对外部列表元素进行分组,例如水果、香蕉
-为了得到一个这样的组的最大值,根据它们的第三个元素,第一个字母V+它后面的数字,将其固定,以处理具有多个数字的数字
-指定分组条件的步骤
或者,您可以使用老式的手动方式,例如使用帮助器字典:
您可以使用:
-根据前2个值对外部列表元素进行分组,例如水果、香蕉
-为了得到一个这样的组的最大值,根据它们的第三个元素,第一个字母V+它后面的数字,将其固定,以处理具有多个数字的数字
-指定分组条件的步骤
或者,您可以使用老式的手动方式,例如使用帮助器字典:
另一种可能的办法:
1创建一个映射第一列和第二列索引的字典,并映射每对的最新索引。这允许数据在最后正确排序
2创建第一列和第二列的所有不同分组的列表
3从2中找出每个分组的最大v值,并将其与其余元素组合。这将作为折叠列表返回
4根据1对折叠的列表进行排序
示例代码:
输出:
另一种可能的办法:
1创建一个映射第一列和第二列索引的字典,并映射每对的最新索引。这允许数据在最后正确排序
2创建第一列和第二列的所有不同分组的列表
3从2中找出每个分组的最大v值,并将其与其余元素组合。这将作为折叠列表返回
4根据1对折叠的列表进行排序
示例代码:
输出:
名单排序了吗?还有,你试过什么?请显示您解决此问题的尝试。列表已按第0列排序,但第1列未排序。起初我认为两者都会被分类,所以我提出了这个解决方案。在中编辑它。现在第二列没有排序,我真的不知道从这里去哪里。列表排序了吗?还有,你试过什么?请显示您解决此问题的尝试。列表已按第0列排序,但第1列未排序。起初我认为两者都会被分类,所以我提出了这个解决方案。在中编辑。现在第二列没有排序,我真的不知道从这里走到哪里。谢谢!我忘了提到col2中的数据也会以不同的col1重复,并且您的代码仍然可以完美地工作。请问lambda x:intx[-1]是做什么的?lambda是一个匿名函数。这个函数接受一个值,获取字符串的最后一个字符,然后将其转换为整数。谢谢!我忘了提到col2中的数据也会以不同的col1重复,并且您的代码仍然可以完美地工作。请问lambda x:intx[-1]是做什么的?lambda是一个匿名函数。这个函数接受一个值,获取字符串的最后一个字符,然后将其转换为整数。
>>> helper_dict = dict()
>>> for item in data:
... item_v = helper_dict.get((item[0], item[1]), (None, None, "v0"))[2]
... if (item_v[0], int(item_v[1:])) < (item[2][0], int(item[2][1:])):
... helper_dict[(item[0], item[1])] = item
...
>>> print(list(helper_dict.values()))
[['fruit', 'apple', 'v3', 'some data'], ['animal', 'dog', 'v1', 'some data'], ['fruit', 'banana', 'v2', 'some data']]
from collections import defaultdict
data = [['fruit', 'apple', 'v1', 'data 1'],
['fruit', 'apple', 'v2', 'data 2'],
['fruit', 'apple', 'v3', 'data 3'],
['fruit', 'banana', 'v1', 'data 4'],
['fruit', 'banana', 'v2', 'data 5'],
['animal', 'dog', 'v1', 'data 6']]
groups = defaultdict(list)
sort_map = {}
for i, (fst, snd, *rest) in enumerate(data):
sort_map[(fst, snd)] = i
groups[(fst, snd)].append(rest)
result = sorted((list(k) + max(v) for k, v in groups.items()),
key=lambda x: sort_map[(x[0], x[1])])
print(result)
[['fruit', 'apple', 'v3', 'data 3'],
['fruit', 'banana', 'v2', 'data 5'],
['animal', 'dog', 'v1', 'data 6']]