如何将我的dict值class {}更改为[]并按键排序

时间:2017-08-11 07:55:16

标签: python class dictionary

我有一个字符串......

my_string="The way you see people is the way you treat them and the Way you treat them is what they become"

我的def应该返回:

{2: ['is'],
 3: ['and', 'see', 'the', 'way', 'you'],
 4: ['them', 'they', 'what'],
 5: ['treat'], 
 6: ['become', 'people']}

我的解决方案返回:

{3: {'you', 'see', 'way', 'and', 'the'},
 6: {'become', 'people'}, 
 2: {'is'},
 5: {'treat'}, 
 4: {'what', 'them', 'they'}}

我需要按键对字典进行排序并更改值的类...我的值类是{}但是我想要[] 我的解决方案:

def n_letter_dictionary(my_string):
    my_string=my_string.lower().split()
    sample_dictionary={}
    r=[]
    for word in my_string:
        lw=len(word)
        if lw in sample_dictionary:
            sample_dictionary[lw].add(word)
        else:
            sample_dictionary[lw] = {word}

    return sample_dictionary



print(n_letter_dictionary("The way you see people is the way you treat them 
and the Way you treat them is what they become"))

我怎么能这样做?任何人都可以帮忙吗?

3 个答案:

答案 0 :(得分:1)

你有套装,因为你在这里创建了一套:

sample_dictionary[lw] = {word}

你需要在那里列出一个清单:

sample_dictionary[lw] = [word]

并使用.append(),而非.add()添加更多元素。

请注意,使用dict.setdefault()

可以简化您的代码
def n_letter_dictionary(my_string):
    sample_dictionary = {}
    for word in my_string.lower().split():
        sample_dictionary.set_default(len(word), []).append(word)
    return sample_dictionary

.setdefault()返回给定键的值;如果密钥丢失,则首先将该密钥设置为第二个参数中提供的默认值。

如果您只想保留唯一的字词,则必须在事件之后使用额外的循环将集合转换为列表

def n_letter_dictionary(my_string):
    sample_dictionary = {}
    for word in my_string.lower().split():
        sample_dictionary.set_default(len(word), set()).add(word)
    return {l: list(v) for l, v in sample_dictionary.items()}

最后一行是字典理解;它使用相同的键构建一个新的字典,并将每个set值转换为一个列表。请注意,集合是无序的,因此结果列表将按任意顺序列出唯一字。如果您需要保留输入中单词的顺序,那么您已将这些单词收集到列表中,然后将How do you remove duplicates from a list in whilst preserving order?中的技术应用于每个值。

字典也是无序的,就像集合一样,并且无法排序。有关解决方法,请参阅How can I sort a dictionary by key?

例如,您可以从已排序的(key, value)对中生成OrderedDict() instance

from collections import OrderedDict

def n_letter_dictionary(my_string):
    sample_dictionary = {}
    for word in my_string.lower().split():
        sample_dictionary.set_default(len(word), set()).add(word)
    return OrderedDict((l, list(v)) for l, v in sorted(sample_dictionary.items()))

答案 1 :(得分:0)

默认情况下,在python<中,Dicts是无序的3.7。你可以做的是使用OrderedDict。它保留了数据插入的顺序,如果您插入已排序的数据,它将保持排序。

  <div class="dropdown">
          <button class="btn btn-default dropdown-toggle" type="button" data-toggle="dropdown">Type
              <span class="caret"></span></button>
                <ul class="dropdown-menu">
                 <li><button>login</button></li>
                 <li><a>password</a></li>
                </ul>
               </div>

<input class="form-control" name="type" placeholder="value" ng-model="value">

答案 2 :(得分:0)

您还可以使用集合中的Counter()来解决此问题。它会让你的生活更轻松。

import collections
c = collections.Counter(mystring.lower().split(' '))
for key in sorted([*c]):
    print("{0} : {1}".format(key, c[key]))