<SYSTEM_TASK:>
Solve the following problem using Python, implementing the functions described below, one line at a time
<END_TASK>
<USER_TASK:>
Description:
 def get_desired_factors(ini):
 """Get the list of desired envs per declared factor. Look at all the accepted configuration locations, and give a list of envlists, one for each Travis factor found. Look in the ``[travis]`` section for the known Travis factors, which are backed by environment variable checking behind the scenes, but provide a cleaner interface. Also look for the ``[tox:travis]`` section, which is deprecated, and treat it as an additional ``python`` key from the ``[travis]`` section. Finally, look for factors based directly on environment variables, listed in the ``[travis:env]`` section. Configuration found in the ``[travis]`` and ``[tox:travis]`` sections are converted to this form under the hood, and are considered in the same way. Special consideration is given to the ``python`` factor. If this factor is set in the environment, then an appropriate configuration will be provided automatically if no manual configuration is provided. To allow for the most flexible processing, the envlists provided by each factor are not combined after they are selected, but instead returned as a list of envlists, and expected to be combined as and when appropriate by the caller. This allows for special handling based on the number of factors that were found to apply to this environment. """

    # Find configuration based on known travis factors
    travis_section = ini.sections.get('travis', {})
    found_factors = [
        (factor, parse_dict(travis_section[factor]))
        for factor in TRAVIS_FACTORS
        if factor in travis_section
    ]

    # Backward compatibility with the old tox:travis section
    if 'tox:travis' in ini.sections:
        print('The [tox:travis] section is deprecated in favor of'
              ' the "python" key of the [travis] section.', file=sys.stderr)
        found_factors.append(('python', ini.sections['tox:travis']))

    # Inject any needed autoenv
    version = os.environ.get('TRAVIS_PYTHON_VERSION')
    if version:
        default_envlist = get_default_envlist(version)
        if not any(factor == 'python' for factor, _ in found_factors):
            found_factors.insert(0, ('python', {version: default_envlist}))
        python_factors = [(factor, mapping)
                          for factor, mapping in found_factors
                          if version and factor == 'python']
        for _, mapping in python_factors:
            mapping.setdefault(version, default_envlist)

    # Convert known travis factors to env factors,
    # and combine with declared env factors.
    env_factors = [
        (TRAVIS_FACTORS[factor], mapping)
        for factor, mapping in found_factors
    ] + [
        (name, parse_dict(value))
        for name, value in ini.sections.get('travis:env', {}).items()
    ]

    # Choose the correct envlists based on the factor values
    return [
        split_env(mapping[os.environ[name]])
        for name, mapping in env_factors
        if name in os.environ and os.environ[name] in mapping
    ]