如何建立具有定义参数的位置范围?

时间:2019-01-24 16:48:07

标签: python

我有一个非常基础的编程背景,但是接到了一项快速的任务,即拥有一个可以获取源和目标位置并实质上吐出源和目标之间所有位置范围的程序。

我构建了输入GUI,并将所有变量都传递到函数中,现在我只需要弄清楚如何正确地循环进行此操作即可。

该位置采用这种形式(不带空格):XXXXXXXXXXX 001 X 01 01

根据我传入的值对X进行硬编码。最后一个条目应该首先缩放。在最后2个字段中的每个字段中,我也都有一个可能的最大值条目。

示例来源:XXXXXXXXXXX003X0102

目的地示例:XXXXXXXXXXX004X0201

在这种情况下,程序将根据003和004之间的范围吐出以下内容,最后2个位置的最大范围为03和02(将添加空格以便于阅读):

[使用输入的范围,最大值为"XXXXXXXXXXX 003->004 X 01->03 01->02"]

XXXXXXXXXXX 003 X 01 02
XXXXXXXXXXX 003 X 02 01
XXXXXXXXXXX 003 X 02 02
XXXXXXXXXXX 003 X 03 01
XXXXXXXXXXX 003 X 03 02
XXXXXXXXXXX 004 X 01 01
XXXXXXXXXXX 004 X 01 02
XXXXXXXXXXX 004 X 02 01

现在,我能够创建一个GUI,以输入所有这些值并将其传递给函数。

我认为这最好使用输入的范围嵌套3个for循环,但是我真的很困惑如何嵌套在循环中时以前导0加上条件最大值来递增。

伪代码未完成->

def addressGenerator(bMax, cMax, X, sourceA, sourceB, sourceC, destinationA, destinationB, destinationC):
    for x in range(sourceA, destinationA):
        for y in range(01, bMax):
            for z in range(01, cMax):
                # content

3 个答案:

答案 0 :(得分:1)

现在,不必担心前导零。而是使用整数来维护您的计数,然后使用格式化的打印语句为您插入零:

import 'package:flutter/material.dart';

class FitTextField extends StatefulWidget {

  final String initialValue;
  final double minWidth;

  const FitTextField({Key key, this.initialValue, this.minWidth: 30}): super(key: key);

  @override
  State<StatefulWidget> createState() => new FitTextFieldState();
}

class FitTextFieldState extends State<FitTextField>{

  TextEditingController txt = TextEditingController();

  // We will use this text style for the TextPainter used to calculate the width
  // and for the TextField so that we calculate the correct size for the text
  // we are actually displaying
  TextStyle textStyle = TextStyle(color: Colors.grey[600]);

  initState() {
    super.initState();
    // Set the text in the TextField to our initialValue
    txt.text = widget.initialValue;
  }

  @override
  Widget build(BuildContext context) {
    // Use TextPainter to calculate the width of our text
    TextSpan ts = new TextSpan(style: textStyle, text: txt.text);
    TextPainter tp = new TextPainter(text: ts, textDirection: TextDirection.ltr);
    tp.layout();
    var textWidth = tp.width; // We will use this width for the container wrapping our TextField

    // Enforce a minimum width
    if ( textWidth < widget.minWidth ) {
      textWidth = widget.minWidth;
    }

    return Container(
      width: textWidth,
      child: TextField(
        style: textStyle,
        controller: txt,
        onChanged: (text) {
          // Tells the framework to redraw the widget
          // The widget will redraw with a new width
          setState(() {});
        },
      ),
    );
  }
}

答案 1 :(得分:1)

我认为这样做。三个范围作为元组传递,每个元组包含所需的起始值和终止值(包括起始值和终止值)。我还添加了一个separator参数,因为它看起来像在您的问题中显示的输出中有一个无法解释的杂散“ X”。

更新:已修改为对您在以下有关“来源”和“目的地”的含义的注释中施加限制,并删除了先前的警告。

我认为该代码难以辨认,并且可能可以重构,但是正如我所说,我相信它(现在)可以实现您的目标。

对其可用性的一个改进可能是使其解析srcdst字符串参数并自动确定间隔。

def addressGenerator(prefix, separator, src, dst, interval1, interval2, interval3):
    minval, maxval = int(src), int(dst)

    for x in range(interval1[0], interval1[1]+1):
        for y in range(interval2[0], interval2[1]+1):
            for z in range(interval3[0], interval3[1]+1):
                v = x * 10000 + y * 100 + z
                if minval <= v <= maxval:
                    pieces = prefix, '%03d' % x, separator, '%02d' % y, '%02d' % z
                    yield ''.join(pieces)

# Sample usage.
for address in addressGenerator('XXXXXXXXXXX', 'Y',
                                '0030102', '0040201', (3, 4), (1, 3), (1, 2)):
    print(address)

输出:

XXXXXXXXXXX003Y0102
XXXXXXXXXXX003Y0201
XXXXXXXXXXX003Y0202
XXXXXXXXXXX003Y0301
XXXXXXXXXXX003Y0302
XXXXXXXXXXX004Y0101
XXXXXXXXXXX004Y0102
XXXXXXXXXXX004Y0201

答案 2 :(得分:0)

我认为您的工作方向正确,但是您的addressGenerator函数对我来说参数太多。假设您可以将源字符串和目标字符串分成类似(XXXXXXXXXXX, 003, X, 01, 02)的元组。然后,您有了一个仅接收源和目标元组的函数。

这些是元组中的索引:

 0            1    2  3   4
(XXXXXXXXXXX, 003, X, 01, 02)

我认为您想要在索引source[1] -> destination[1]之间循环; source[3] -> destination[3];和source[4] -> destination[4]。大致就是您已经拥有的。然后,您可以使用填充来格式化不同的内容。

def get_addresses(source, destination):
    for a in range(int(source[1]), int(destination[1]):
        for b in range(int(source[3]), int(destination[3])):
            for c in range(int(source[4]), int(destination[4])):
                yield '{}{:03d}{}{:02d}{:02d}'.format(source[0], a, source[2], b, c)