从列表字典创建新的字符串列表(即从具有字符串列表作为值的字典)

Posted

技术标签:

【中文标题】从列表字典创建新的字符串列表(即从具有字符串列表作为值的字典)【英文标题】:Creating new string lists from a Dictionary of lists ( i.e from a dictionary which has string Lists as values) 【发布时间】:2021-01-29 01:03:00 【问题描述】:

我有一个字典字符串(键)和值字符串列表。我希望能够打印出 // 列表的内容(而不是获取 System.Collections.Generic.List`1[System.String] ),而且 // 能够获取每个值(字符串)并创建新列表

基本上我应该在结果字典中有 3 个列表(一个由虚幻组成,另一个包含 //batter 和 patter,另一个包含 4 个不包含任何 a 的单词)

我有这样的事情

using System;
    
using System.Collections.Generic;
    
using System.Text;
    
static void Main(string[] args)

    List<string> wordList = new List<string>()  "unreal", "batter", "butter", "patter", 
                          "tested", "nested", "pested" ;
    char letter = 'a';
    
    Dictionary<string, List<string>> results = new Dictionary<string, List<string>>();
    // So at each key ( so the ----a- for instance) it will have it's own dictionary
    foreach (string word in wordList)
    
         StringBuilder builder = new StringBuilder();
         //   builder.Append(word);
         for (int i = 0; i < word.Length; i++)
         
             //  builder = null;
             if (word[i] == letter)
             
                 builder.Append(letter);
                 //  key = String.Join(word, wordList);
                 // builder[i] = letter;
             
             else
             
                 // builder[i] = '-';
                 builder.Append('-');
             
         

         string key = builder.ToString();

         // var result = string.Join(key, word);
         if (results.ContainsKey(key))
         
             List<string> list = results[key];
             list.Add(word);
         
         else
         
             List<string> list = new List<string>();
             list.Add(word);
             results.Add(key, list);
         
              
         //   results.Add(result)          
    

    foreach(KeyValuePair<string,List<string>> kvp in results)
    
        Console.WriteLine("0 has 1 words", kvp.Key, kvp.Value.Count);
        // Console.WriteLine(kvp.Value.Count);
    

【问题讨论】:

请使用C#类型而不是英文描述。你是想说Dictionary&lt;string, List&lt;string&gt;&gt;吗? // 是什么意思? “打印内容”而不是获取List&lt;string&gt; 是什么意思?这些 cmets 是干什么用的? 【参考方案1】:

创建字典的更简洁的方法是在列表中使用GroupBy,按单词的字符串表示形式对项目进行分组,其中所有字符都替换为'-',但等于letter 的字符除外(我们通过使用Select 方法创建,选择'-''a' 字符,然后使用string.Concat 将结果集组合成一个字符串),然后使用@ 转换为Dictionary&lt;string, List&lt;string&gt;&gt; 987654331@,将Group.Key 用于字典Key,并在组本身上使用ToList() 创建字典Value

List<string> wordList = new List<string>()
"unreal", "batter", "butter", "patter", "tested", "nested", "pested";

char letter = 'a';

Dictionary<string, List<string>> results = wordList
    .GroupBy(item => string.Concat(item.Select(c => c == letter ? c : '-')))
    .ToDictionary(group => group.Key, group => group.ToList());

然后您可以使用string.Join 输出每个列表的实际项目值:

foreach (KeyValuePair<string, List<string>> kvp in results)

    Console.Write("0 has 1 words: ", kvp.Key, kvp.Value.Count);
    Console.WriteLine(string.Join(", ", kvp.Value));

输出

【讨论】:

真是太棒了,谢谢!我只是想知道如何获得其中一个列表(即击球手和模式词)并将这两个词转移到原始 wordList 列表中?有没有办法在 foreach 中做到这一点,还是必须在外面? AddRange将一个列表添加到另一个列表中:wordList.AddRange(results["-a----"]);,但由于这些单词已经在列表中,它们现在将在那里出现两次。我想我可能误解了你的问题……你是这个意思吗? 是的,我就是这个意思!谢谢你。顺便说一句,我只是想知道是否可以进行另一个查询,使我能够识别 wordList 中最常出现的字符? (预期输出将是 e 或 t,但理想情况下是 e,因为它出现在所有单词中,而 t 没有!)。我该怎么办?

以上是关于从列表字典创建新的字符串列表(即从具有字符串列表作为值的字典)的主要内容,如果未能解决你的问题,请参考以下文章

set集合 ,深浅拷贝

使用字典 get() 作为函数从地图创建 Python 列表与使用 for 循环创建字典 get() 列表

从具有值列表的字典创建 Pyqt QtableWidget,然后返回字典

从具有可变长度的列表字典创建数据框

python 字典写入文件join把列表字符拼接成新的字符串。

从嵌套字典结构列表(具有两个级别)创建数据框的 Pythonic 方法是啥?