【问题标题】:How to convert nested sets into lists?如何将嵌套集转换为列表?
【发布时间】:2022-01-18 00:17:54
【问题描述】:

我目前有这个功能

def ndfa_as_str(ndfa: {str: {str: {str}}}) -> str:
    ndfa_str = ""
    sortedfa = sorted(ndfa.keys(), key=lambda x: x.lower())
    for i in sortedfa:
        ndfa_str += ("  {} transitions: {}".format(i, list(sorted(ndfa[i].items()))) + "\n")
    return ndfa_str

ndfa = {
    'end': {},
    'start': {'1': {'start'}, '0': {'near', 'start'}},
    'near': {'1': {'end'}}}

我的函数返回:

"  end transitions: []\\n  near transitions: [(\'1\', {\'end\'})]\\n  start transitions: [(\'0\', {\'near\', \'start\'}), (\'1\', {\'start\'})]\\n"'

但我希望返回:

"  end transitions: []\\n  near transitions: [(\'1\', [\'end\'])]\\n  start transitions: [(\'0\', [\'near\', \'start\']), (\'1\', [\'start\'])]\\n"'

其中的集合是列表。

我能做到这一点的最简单方法是什么?

【问题讨论】:

  • 这能回答你的问题吗? Get a list from a set in python。如果没有,您已经尝试过什么?例如,您知道如何进行列表推导吗?

标签: python string list


【解决方案1】:

我认为这可以满足您的需求。它使用递归嵌套辅助函数,这似乎是合适的,因为集合是嵌套的。它使用内置的sorted() 函数转换遇到的任何集合。

from operator import itemgetter

def ndfa_as_str(ndfa):
    getkey = lambda x: itemgetter(0)(x).lower()

    def value_to_list(obj):
        if isinstance(obj, dict):
            return [(key, value_to_list(value))
                        for key, value in sorted(obj.items(), key=getkey)]
        elif isinstance(obj, set):
            return sorted(obj)
        else:
            return obj

    lines = [f'  {key} transitions: {value_to_list(value)}'
                for key, value in sorted(ndfa.items(), key=getkey)]
    return '\n'.join(lines)


ndfa = {
    'end': {},
    'start': {'1': {'start'}, '0': {'near', 'start'}},
    'near': {'1': {'end'}}}

print(ndfa_as_str(ndfa))

打印结果:

  end transitions: []
  near transitions: [('1', ['end'])]
  start transitions: [('0', ['near', 'start']), ('1', ['start'])]

【讨论】:

    猜你喜欢
    • 2017-11-28
    • 1970-01-01
    • 2016-10-08
    • 1970-01-01
    • 1970-01-01
    • 2020-09-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多