GVKun编程网logo

PyYAML可以非字母顺序转储字典项吗?

13

在这里,我们将给大家分享关于PyYAML可以非字母顺序转储字典项吗?的知识,同时也会涉及到如何更有效地c#–可以将ResharperIntellisense配置为按字母顺序排序吗?、javascrip

在这里,我们将给大家分享关于PyYAML可以非字母顺序转储字典项吗?的知识,同时也会涉及到如何更有效地c# – 可以将Resharper Intellisense配置为按字母顺序排序吗?、javascript – 在Polymer中按字母顺序排序转发器、python - 将带有正确缩进的嵌套字典转储到 yaml、python – 转储解析文档时是否可以保留YAML块结构?的内容。

本文目录一览:

PyYAML可以非字母顺序转储字典项吗?

PyYAML可以非字母顺序转储字典项吗?

yaml.dump用来输出字典。它根据键以字母顺序打印出每个项目。

>>> d = {"z":0,"y":0,"x":0}
>>> yaml.dump( d,default_flow_style=False )
'x: 0\ny: 0\nz: 0\n'

有没有办法控制键/值对的顺序?

在我的特定用例中,反向打印(碰巧)就足够了。为了完整起见,我正在寻找一个答案,该答案显示了如何更精确地控制订单。

我已经看过使用,collections.OrderedDict但是PyYAML不支持(似乎)。我还研究了子类化yaml.Dumper,但是我无法弄清它是否具有更改项目顺序的能力。

c# – 可以将Resharper Intellisense配置为按字母顺序排序吗?

c# – 可以将Resharper Intellisense配置为按字母顺序排序吗?

我最近更新了使用VS2013和Resharper 8.2,(来自VS2010和Resharper 6)并且发现了一个非常讨厌的“功能”,因为Resharper的intellisense没有按字母顺序对一个类的成员进行排序.

举例来说,我有一个名为“client”的对象,它有一个名为Ethnicityrequired的属性,另一个属性叫为Ethnicities.

仅使用本机VS2013 intellisense,这就是我输入的client.eth

这就是我的期望;两个属性都列在一起.

但是,Resharper的Intellisense(更少)给了我这个

虽然可见成员按字母顺序排序,但缺少的种族属性位于列表底部,只有在我键入“ethnicti”以便文本不再与Ethnicityrequired匹配时才会匹配.

通过仔细检查列表,似乎Resharper正在应用某种分组,然后在每个组中按字母顺序排序.

有谁知道如何摆脱这种相当无用的行为,并恢复到像Resharper 6.0和早期版本的直接alpha排序?

如果你能为JetBrains的理由提供辩护,可以获得奖励积分.

解决方法

在Resharper Ultimate 2016.1中,你可以这样做:

Resharper =>选项=> IntelliSense =>完成行为=>按字母顺序设置排序项目

javascript – 在Polymer中按字母顺序排序转发器

javascript – 在Polymer中按字母顺序排序转发器

在角度Js中,您使用过滤器对转发器进行排序,如下所示:

<li ng-repeat="link.title for link in links | orderBy:'title'">

我正在试验聚合物,我想知道你可以使用聚合物过滤器做类似的事情(我想在标记中声明性地对数据进行排序而不是直接在数据集上).所以我一直在努力尝试这一点(为了清晰起见,我已经删除了一些代码):

<polymer-element name="image-links" attributes="axis data width">

<template>

    <core-ajax id="ajax"
               auto
               url="../data/{{data}}.json"
               on-core-response="{{linksLoaded}}"
               handleAs="json">
    </core-ajax>

    <ul>
        <template repeat="{{link in links | sort}}">
            <li>...</li>
        </template>
    </ul>

</template>

<script>

    polymer('image-links',{

        links: [],linksLoaded: function () {
            this.links = this.$.ajax.response.data;
        },sort : function (a,b) {
            var titleA = a.title.toLowerCase(),titleB = b.title.toLowerCase();
            if (titleA < titleB)  return -1;
            if (titleA > titleB) return 1;
            return 0;
        }
    });

</script>

我得到一个空数组传递给元素原型中的sort函数(链接数组中肯定有对象).

这里也是我正在使用的ajax调用的响应:

{
"data" : [
    {
        "name" : "github","url" : "..."
    },{
        "name" : "linked",{
        "name" : "stack",{
        "name" : "gplus",{
        "name" : "twitter","url" : "..."
    }
]
}

这是接近这个的正确方法还是超过我的睡觉时间?!

提前致谢

解决方法

排序过滤器将接收链接数组作为参数,因此您需要执行以下操作:

sort: function(items) {
  items.sort(function (a,b) {
    var titleA = a.title.toLowerCase(),titleB = b.title.toLowerCase();
    if (titleA < titleB)  return -1;
    if (titleA > titleB) return 1;
    return 0;
  });
  return items;
}

使用空数组可能会调用一次,因为链接以这种方式启动并异步填充.

为了更接近Angular构造,你可以有这样的东西:

<template repeat="{{link in links | orderBy('title')}}">
...
orderBy: function(items,key) {
  var sorter = function (a,b) {
    var titleA = a[key].toLowerCase(),titleB = b[key].toLowerCase();
    if (titleA < titleB)  return -1;
    if (titleA > titleB) return 1;
    return 0;
  };
  items.sort(sorter);
}

有很多方法可以将分类器提取为可重用的形式,但最简单的解决方案是导入polymer-filters,它将提供与Angular相同或类似的orderBy(和许多其他过滤器).使用polymer-filters,语法与我在第二个示例中显示的相同,但您可以完全省略orderBy实现.

python - 将带有正确缩进的嵌套字典转储到 yaml

python - 将带有正确缩进的嵌套字典转储到 yaml

如何解决python - 将带有正确缩进的嵌套字典转储到 yaml?

我非常接近于自动转储从数据框创建的 yml 文件以用于自动化任务。

我有一个结构如下的函数:

def get_all_values(nested_dictionary):
    for key,value in nested_dictionary.items():
        model = {
           "models": [
                {
            "name": key,"columns": None
                }
            ]
        }            
        yield(model)
        for key,value in value.items():
                table = [
                    {
                       "name": key,"tests": [            
                                "not_null","unique"            
                            ]
                       }
                ]
                yield(table)
    nested_dictionary = d1
    get_all_values(nested_dictionary)
    data = get_all_values(nested_dictionary)
    with open(''data.yml'',''w'') as outfile:
        with redirect_stdout(outfile):
            for i in data:
                ruamel.yaml.round_trip_dump(i,outfile,indent=5,block_seq_indent=2)

它引用的字典作为生成器产生。 dicts 结构是:

    {''models'': [{''name'': ''budgets_sales'',''columns'': None}]}
[{''name'': ''budget_amt'',''tests'': [''not_null'',''unique'']}]
[{''name'': ''budget_group'',''unique'']}]
[{''name'': ''budget_name'',''unique'']}]
[{''name'': ''budget_pk'',''unique'']}]
        

这“很好”...但输出如下:

models:
  -  name: budgets_sales
     columns:
  -  name: budget_amt
     tests:
       -  not_null
       -  unique
  -  name: budget_group
     tests:
       -  not_null
       -  unique
  -  name: budget_name
     tests:
       -  not_null
       -  unique

我要求字典中键的所有值都有一个额外的缩进。我不知道如何使值对键缩进。

如果正确,它看起来像这样:

- name: budgets_sales
  columns:
      -  name: budget_amt
         tests:
            -  not_null
            -  unique
      -  name: budget_group
         tests:
            -  not_null
            -  unique
      -  name: budget_name
         tests:
            -  not_null
            -  unique
      -  name: budget_pk
         tests:
            -  not_null
            -  unique
      -  name: entry_type_code
         tests:
            -  not_null
            -  unique
      -  name: institution_fk
         tests:
            -  not_null
            -  unique

谁能提供一个方法?


感谢 Anthon,这就是我最终使用的:

def get_all_values(nested_dictionary):
    res = [{"version":2},{"models":None}]
    for key,value in nested_dictionary.items():
        seq = []
        res.append([{"name": key,"columns": seq}])
        # for key1,value1 in value.items():  # not using value1
        for key1 in value.keys():
            elem = {"name": key1,"tests": ["not_null","unique"]}
            seq.append(elem)
    return res

nested_dictionary = d1

get_all_values(nested_dictionary)

data = get_all_values(nested_dictionary)

    
with open(''data.yml'',''w'') as outfile:
    
    with redirect_stdout(outfile):
        
        for i in data:  
            
            yaml = ruamel.yaml.YAML()
            yaml.indent(mapping=5,sequence=5,offset=4)            
            yml.dump(i,outfile)

解决方法

在您需要的输出中,与键 columns 关联的值是一个序列。 如果你的 Python 数据结构是一个列表,你只会得到它,所以请确保你 将您的个人 table 条目附加到某个变量。

我猜测 d1 基于您的“不正确”输出:

import sys
import ruamel.yaml

d1 = dict(budgets_sales=dict(budget_amt=None,budget_group=None,budget_name=None,budget_pk=None))

def get_all_values(nested_dictionary):
    res = []
    for key,value in nested_dictionary.items():
        seq = []
        res.append({"name": key,"columns": seq})
        # for key1,value1 in value.items():  # not using value1
        for key1 in value.keys():
            elem = {"name": key,"tests": ["not_null","unique"]}
            seq.append(elem)
    return res
    
data = get_all_values(d1)

yaml = ruamel.yaml.YAML()
yaml.indent(mapping=5,sequence=5,offset=3)
yaml.dump(data,sys.stdout)

给出:

   - name: budgets_sales
     columns:
        - name: budgets_sales
          tests:
             - not_null
             - unique
        - name: budgets_sales
          tests:
             - not_null
             - unique
        - name: budgets_sales
          tests:
             - not_null
             - unique
        - name: budgets_sales
          tests:
             - not_null
             - unique

您应该考虑一些事项(除了在 SO 上更好地格式化您的代码和数据):

  • round_trip_dump 函数已被弃用,请勿在新代码中使用
  • 至少从 2007 年 9 月起,推荐的包含 YAML 文档的文件扩展名为 .yaml
  • 不要在多个阶段编写 YAML 文件,创建一个完整的数据结构并转储它。如果您希望在一个文件中包含多个 YAML 文档,请列出数据结构并使用 .dump_all() 方法。

如果所有其他方法都失败了,并且您有想要生成为输出的有效手工 YAML,请加载该 YAML(使用 YAML(typ=''safe'').load() 并检查您获得的 Python 中的数据结构。

python – 转储解析文档时是否可以保留YAML块结构?

python – 转储解析文档时是否可以保留YAML块结构?

我们使用PyYAML为不同的环境准备配置文件.但是我们的YAML阻止了完整性.

给input.yml …

pubkey: |
    -----BEGIN PUBLIC KEY-----
    MIGfMA0GCSq7OPxRrQEBAQUAA4GNADCBiQKBgQCvRVUKp6pr4qBEnE9lviuyfiNq
    QtG/OCyBDXL4Bh3FmUzfNI+Z4Bh3FmUx+z2n0FCv/4BpgHTDl8D95NPopWVo1RH2
    UfhyMd6dQ/x9T5m+y38JMzmSVAk+Fqu8ya18+yQVOEyEIx3Gxpsgegow33gcxfjK
    EsUgJHXcpw7OPxRrCQIDAQAB
    -----END PUBLIC KEY-----

…使用python3执行此程序…

import yaml

with open('input.yml',mode='r') as f:
    parsed = yaml.safe_load(f)

with open('output.yml',mode='w') as f:
    yaml.dump(parsed,f)

…产生这个output.yml …

pubkey: '-----BEGIN PUBLIC KEY-----

    MIGfMA0GCSq7OPxRrQEBAQUAA4GNADCBiQKBgQCvRVUKp6pr4qBEnE9lviuyfiNq

    QtG/OCyBDXL4Bh3FmUzfNI+Z4Bh3FmUx+z2n0FCv/4BpgHTDl8D95NPopWVo1RH2

    UfhyMd6dQ/x9T5m+y38JMzmSVAk+Fqu8ya18+yQVOEyEIx3Gxpsgegow33gcxfjK

    EsUgJHXcpw7OPxRrCQIDAQAB

    -----END PUBLIC KEY-----

    '

是否可以使用PyYAML保留块的结构?

解决方法

是的,可以使用pyyaml,但你必须提供自己的增强版本,至少是safe_load使用的Scanner,Parser和Constructor,dump使用的Emitter,Serializer和Representer,
并提供一个专门的类似字符串的类,用于保存有关其原始格式的信息.

这是添加到ruamel.yaml(免责声明:我是该软件包的作者)的一部分,因为它是从PyYAML派生的,并且仍然保持类似的设置.使用ruamel.yaml:

import ruamel.yaml as yaml

yaml_str = """\
pubkey: |
    -----BEGIN PUBLIC KEY-----
    MIGfMA0GCSq7OPxRrQEBAQUAA4GNADCBiQKBgQCvRVUKp6pr4qBEnE9lviuyfiNq
    QtG/OCyBDXL4Bh3FmUzfNI+Z4Bh3FmUx+z2n0FCv/4BpgHTDl8D95NPopWVo1RH2
    UfhyMd6dQ/x9T5m+y38JMzmSVAk+Fqu8ya18+yQVOEyEIx3Gxpsgegow33gcxfjK
    EsUgJHXcpw7OPxRrCQIDAQAB
    -----END PUBLIC KEY-----
"""

data = yaml.load(yaml_str,Loader=yaml.roundtripLoader)
print(yaml.dump(data,Dumper=yaml.roundtripDumper,indent=4))

给你:

pubkey: |
    -----BEGIN PUBLIC KEY-----
    MIGfMA0GCSq7OPxRrQEBAQUAA4GNADCBiQKBgQCvRVUKp6pr4qBEnE9lviuyfiNq
    QtG/OCyBDXL4Bh3FmUzfNI+Z4Bh3FmUx+z2n0FCv/4BpgHTDl8D95NPopWVo1RH2
    UfhyMd6dQ/x9T5m+y38JMzmSVAk+Fqu8ya18+yQVOEyEIx3Gxpsgegow33gcxfjK
    EsUgJHXcpw7OPxRrCQIDAQAB
    -----END PUBLIC KEY-----

至少使用Python 2.7和3.5.

indent = 4是必要的,因为roundtripDumper默认为两个空格缩进和原始缩进
不保留文件(不这样做可以简化重新缩进YAML文件).

如果您无法切换到ruamel.yaml,您应该能够使用其源代码提取所需的所有更改,但如果可以,您还可以使用其他功能,如注释和合并密钥名称保留.

我们今天的关于PyYAML可以非字母顺序转储字典项吗?的分享已经告一段落,感谢您的关注,如果您想了解更多关于c# – 可以将Resharper Intellisense配置为按字母顺序排序吗?、javascript – 在Polymer中按字母顺序排序转发器、python - 将带有正确缩进的嵌套字典转储到 yaml、python – 转储解析文档时是否可以保留YAML块结构?的相关信息,请在本站查询。

本文标签: