统计键值相同的key(python java)

python

代码

reversed_dict_per_length = {}
vv=[]
vals=list(mapping.values())
for i in range(0,len(vals)):
    rvs={}
    v=vals[i]
    if v in vv:   #已统计
       continue                    
    
    #遍历相同值的key
    kk=[]
    for (k1,v1) in mapping.items():        
       if(v1==v):
           kk.append(k1) 
    #字典记录 值及 对应的键列表
    rvs[v]=kk
    
    cnt=vals.count(v)  #相同值的数量
    if cnt not in reversed_dict_per_length:
        reversed_dict_per_length[cnt]=rvs
    else:
        tmp=reversed_dict_per_length[cnt]      
        tmp.update(rvs)  #更新rvs到tmp
        reversed_dict_per_length[cnt]=tmp     
    vv.append(v)   
# {数量:{   值1:    【key1】 ,值2:【Key2】   }


print('\nThe (triply ordered) reversed dictionary per lengths is: ')
pprint(reversed_dict_per_length)

 

运行结果

java

代码

import java.util.Collection;
import java.util.HashMap;
import java.util.HashSet;
import java.util.LinkedHashMap;
import java.util.Map;
import java.util.Set;
import java.util.SortedSet;
import java.util.TreeSet;

public class tess {
	public static void main(String[] args) {
	
//20 11		2: 4, 3: 9, 4: 4, 5: 8, 6: 2, 7: 5, 8: 11, 9: 1, 10: 10, 11: 5
		Map<Integer, Integer> map = new HashMap<Integer, Integer>();
		map.put(2, 4);
		map.put(3, 9);
		map.put(4, 4);
		map.put(5, 8);
		map.put(6, 2);
		map.put(7, 5);
		map.put(8, 11);
		map.put(9, 1);
		map.put(10, 10);
		map.put(11, 5);
		

		//#遍历值相同的键: 键的数量:    值:【键1,键2...】
		Map<Integer, Object> reversed_dict_per_length = new HashMap<Integer, Object>();
		Set<Integer>  vv=new HashSet<>();
		Collection<Integer> vals=map.values();
		for (int v : vals) {
			Map<Integer, Object> rvs = new HashMap<Integer, Object>();
            if (vv.contains(v)) {
				continue;
			}
//            遍历相同值的key
            int cnt=0;
            Set<Integer>  kk=new HashSet<>();
            for(Integer k1:map.keySet()) {
            	if(map.get(k1)==v) {
            		kk.add(k1);
            		cnt++;
            	}
            }
            rvs.put(v, kk);
            if (reversed_dict_per_length.get(cnt)==null) {
				reversed_dict_per_length.put(cnt, rvs);
			} else {
				Map<Integer, Object>	  tmp= 	(Map<Integer, Object>) reversed_dict_per_length.get(cnt);
		        tmp.put(v, kk);
		        reversed_dict_per_length.put(cnt, tmp);
		        
			}           
			vv.add(v);
		}
		
		System.out.println("The (triply ordered) reversed dictionary per lengths is: ");
		System.out.println("显示1"+reversed_dict_per_length);
		int s=0;
		System.out.print("显示2{");
		for (Integer cnt : reversed_dict_per_length.keySet()) {
			System.out.print(s==0?(cnt+":"):(","+cnt+":") ); 			
			Map<Integer, Object>	  tmp= 	(Map<Integer, Object>) reversed_dict_per_length.get(cnt);
			int s2=0;
			System.out.print("{");
			for(int v:tmp.keySet()) {
				System.out.print(s2==0?(v+":"+tmp.get(v)):(","+v+":"+tmp.get(v)) ); 				
				s2++;
	        }
	        System.out.print("}");
	        s++;
		}
		System.out.print("}");
//		{1: {1: [9], 2: [6], 8: [5], 9: [3], 10: [10], 11: [8]},2: {4: [2, 4], 5: [7, 11]}}
	}
}

 

运行结果

键值对数据结构中,是否允许相同key)的存在,取决于具体的数据结构和实现方式。大多数标准键值对结构(如 C# 的 `Dictionary`、Java 的 `HashMap`、Python 的 `dict`)都要求是唯一的,以确保通过能够准确、高效地检索对应的值。然而,某些特殊的数据结构或实现允许的重复,或者通过其他机制处理冲突。 ### 允许重复键值对结构 1. **多值字典(Multimap)** 在一些编程语言或库中,存在一种称为 `Multimap` 的数据结构,它允许一个对应多个值。例如,在 C++ 的 `std::multimap` 中,可以重复,每个可以关联多个值。这种方式适用于需要一个对应多个值的场景,如统计学分析、图结构中的邻接表等。 示例代码(C++): ```cpp #include <iostream> #include <map> int main() { std::multimap<int, std::string> mm; mm.insert({1, "apple"}); mm.insert({1, "banana"}); mm.insert({2, "orange"}); for (const auto& pair : mm) { std::cout << pair.first << ": " << pair.second << std::endl; } } ``` 2. **自定义键值结构** 在某些情况下,可以通过自定义数据结构来模拟“重复”的行为。例如,将对应的值设计为列表(`List<T>`)或集合(`Set<T>`),从而一个可以关联多个值。 示例代码(C#): ```csharp using System; using System.Collections.Generic; class Program { static void Main() { Dictionary<string, List<string>> multiDict = new Dictionary<string, List<string>>(); multiDict["fruit"] = new List<string> { "apple", "banana" }; multiDict["vegetable"] = new List<string> { "carrot" }; foreach (var key in multiDict.Keys) { Console.WriteLine(key + ": " + string.Join(", ", multiDict[key])); } } } ``` 3. **Redis 中的键值模型** Redis 是一个键值存储系统,其中每个对应一个值,但该值可以是复杂的数据结构,如列表、集合或哈希表。虽然 Redis 的是唯一的,但可以通过使用列表或集合来实现一个关联多个值的效果。例如,使用 `RPUSH` 向列表中添加元素,从而实现一个对应多个值的功能[^1]。 示例命令: ```bash RPUSH mylist "value1" RPUSH mylist "value2" LRANGE mylist 0 -1 ``` 4. **默认值处理(Python 中的 defaultdict)** 在 Python 中,`defaultdict` 允许为不存在的提供默认值。虽然本身仍然是唯一的,但这种机制可以简化对缺失的处理,适用于某些场景,如统计词频或构建树形结构。 示例代码(Python): ```python from collections import defaultdict word_count = defaultdict(int) words = ["apple", "banana", "apple", "orange"] for word in words: word_count[word] += 1 print(word_count) ``` ### 重复的处理方式 - **覆盖值**:大多数键值对结构(如 C# 的 `Dictionary`、Java 的 `HashMap`)在遇到重复时会直接覆盖原有的值,而不是抛出异常。例如,使用 `Dictionary[key] = value` 时,如果已存在,则更新其对应的值。 - **抛出异常**:某些方法(如 `Dictionary.Add`)在已存在的情况下会抛出异常,确保不会意外覆盖已有数据。 - **自定义冲突处理**:部分实现允许通过自定义逻辑来处理冲突,例如合并值或记录冲突日志。 ### 总结 尽管大多数标准键值对结构要求的唯一性,但通过多值字典、自定义结构、Redis 的复杂值类型或默认值机制,可以实现类似“允许相同”的功能。这些方法适用于不同的应用场景,开发者可以根据具体需求选择合适的数据结构或实现方式。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值