从列表字典创建新的字符串列表(即从具有字符串列表作为值的字典)
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<string, List<string>>
吗? //
是什么意思? “打印内容”而不是获取List<string>
是什么意思?这些 cmets 是干什么用的?
【参考方案1】:
创建字典的更简洁的方法是在列表中使用GroupBy
,按单词的字符串表示形式对项目进行分组,其中所有字符都替换为'-'
,但等于letter
的字符除外(我们通过使用Select
方法创建,选择'-'
或'a'
字符,然后使用string.Concat
将结果集组合成一个字符串),然后使用@ 转换为Dictionary<string, List<string>>
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 没有!)。我该怎么办?以上是关于从列表字典创建新的字符串列表(即从具有字符串列表作为值的字典)的主要内容,如果未能解决你的问题,请参考以下文章
使用字典 get() 作为函数从地图创建 Python 列表与使用 for 循环创建字典 get() 列表
从具有值列表的字典创建 Pyqt QtableWidget,然后返回字典