Python的情况
Python的分组和Java分组实现
在实际开发中,涉及到分组和排序,
可以使用Pandas中的分组,在使用Pandas中的,在使用Panda之前,可以使用Python内建的数据结构实现分组
Java分组,思路类似,这里展示了两种方法,一种是传统的,一种是Java 1.8+版本的
Python分组
Python分组,通过字典实现
01.分组的方式
from itertools import groupby
for key, values_iter in groupby(input_list, key=sortkeyfn):
# 字典中的键映射多个值
result[key] = list(v[0] for v in values_iter)
for key, values_iter in groupby(input_list, key=sortkeyfn):
for v in values_iter:
len_result[key] = len_result.get(key, 0) + 1
02.from collections import defaultdict
d = defaultdict(list)
for key, value in pairs:
d[key].append(value)
03.功能类似以下情况
def generate_multi_dict(pairs_list) -> dict:
f_dict_eg = dict()
for key_cd, value_cd in pairs_list:
data = f_dict_eg.get(key_cd)
if data is None:
f_dict_eg[key_cd] = []
f_dict_eg[key_cd].append(value_cd)
return f_dict_eg
def generate_multi_dict_cnt(pairs_list) -> dict:
f_dict_eg = dict()
for key_cd, value_cd in pairs_list:
f_dict_eg[key_cd] = f_dict_eg.get(key_cd, 0) + 1
return f_dict_eg
Python 排序
sorted函数
01.sorted函数用来排序,sorted(iterable[, cmp[, key[, reverse]]])
其中key的参数为一个函数或者lambda函数。所以itemgetter可以用来当key的参数
from operator import itemgetter
#itemgetter用来去dict中的key,省去了使用lambda函数
02. sorted 如果第一个条件 相同 则按第二个条件排序
使用lambda函数
sorted(my_dict.items(), key=lambda s: (s[1], -str(s[0]).count("*")), reverse=False)
列表表达式和函数式编程
ln = [x for x in backup_list if len(x) >= 2 and isinstance(x, str)]
map filter
字符串
变量替换
正则表达式
Java中的分组
Java 1.8-
//用map存起来新的分组后数据
Map<Integer,Object> map = new HashMap<Integer,Object>();
Java 1.8+ java.util.stream.Stream
示例代码:
import java.util.*;
import java.util.function.Function;
import java.util.stream.Collectors;
public class JavaGroupExample1 {
public static void main(String[] args) {
List<String> items = Arrays.asList(
"banana",
"apple", "apple",
"orange", "orange", "orange",
"peach", "peach", "peach", "peach"
);
// 使用java8特性的写法: java 1.8+ 分组,计数
Map<String, Long> result = items.stream()
.collect(Collectors.groupingBy(Function.identity(), Collectors.counting()));
Map<String, Long> finalMap = new LinkedHashMap<>();
// 排序
result.entrySet().stream()
.sorted(Map.Entry.<String, Long>comparingByValue().reversed())
.forEachOrdered(e -> finalMap.put(e.getKey(), e.getValue()));
System.out.println(result);
System.out.println(finalMap);
//不使用java8特性的写法: < java 1.8
Map<String, List<String>> resultMap = new HashMap<>(1024);
Map<String, Integer> staticMap = new HashMap<>(1024);
for (String item : items) {
List<String> tempList = resultMap.get(item);
//如果取不到数据,那么直接new一个空的ArrayList*
if (tempList == null ) {
tempList = new ArrayList<>();
tempList.add(item);
resultMap.put(item, tempList);
} else {
//之前已经存放过了,则直接追加数据到原来的List里*
tempList.add(item);
}
}
for (Map.Entry<String,List<String>> entry:resultMap.entrySet()) {
staticMap.put(entry.getKey(),entry.getValue().size());
System.out.println(entry.getKey()+":"+entry.getValue());
}
for (Map.Entry entry:staticMap.entrySet()) {
System.out.println(entry.getKey()+":"+entry.getValue());
}
}
}
注意:
不指定类型的时候,编译器默认为object,其方法不显示
解决方式: 添加类型
参考:
python 排序 sorted 如果第一个条件 相同 则按第二个条件排序
在Python中,字典按值排序 https://blog.csdn.net/cxcxrs/article/details/82459800
字典中的键映射多个值 https://python3-cookbook.readthedocs.io/zh_CN/latest/c01/p06_map_keys_to_multiple_values_in_dict.html
通过某个关键字排序一个字典列表 https://python3-cookbook.readthedocs.io/zh_CN/latest/c01/p13_sort_list_of_dicts_by_key.html
Python中用dict统计列表中元素出现的次数 https://www.cnblogs.com/kadycui/p/9226113.html
Python中的分组函数(groupby、itertools) https://www.cnblogs.com/dreamer-fish/p/5522687.html
使用java8特性实现分组 https://zhuanlan.zhihu.com/p/101590532
Java8分组(groupingBy) https://www.cnblogs.com/fengkunangel/p/10434735.html
java8特性:Collectors.groupingBy进行分组、排序等操作 https://blog.csdn.net/beirdu/article/details/78585945