在Python中,它被认为是更好的风格:
我将通过一个人为的例子来解释我的问题.
假设有人编写一个函数_sort_by_scoring,它接受两个参数:评分函数和项列表.它返回原始列表的副本,该副本按照每个项目在原始列表中的位置的分数排序.还提供了两个示例评分函数.
def _sort_by_score(scoring, items_list):
unsorted_scored_list = [(scoring(len(items_list), item_position), item) for item_position, item in enumerate(items_list)]
sorted_list = [item for score, item in sorted(unsorted_scored_list)]
return sorted_list
def _identity_scoring(items_list_size, item_position):
return item_position
def _reversed_scoring(items_list_size, item_position):
return items_list_size - item_position
Run Code Online (Sandbox Code Playgroud)
函数_sort_by_score永远不会直接调用; 相反,它由其他单参数函数调用,它将评分函数及其唯一参数(项目列表)传递给_sort_by_scoring并返回结果.
# Explicit function definition style
def identity_ordering(items_list):
return _sort_by_score(_identity_scoring, items_list)
def reversed_ordering(items_list):
return _sort_by_score(_reversed_scoring, items_list)
Run Code Online (Sandbox Code Playgroud)
显然,这个意图在函数currying方面表达得更好.
# Curried function definition style
import functools
identity_ordering = functools.partial(_sort_by_score, _identity_scoring)
reversed_ordering = functools.partial(_sort_by_score, _reversed_scoring)
Run Code Online (Sandbox Code Playgroud)
用法(在任何一种情况下):
>>> foo = [1, 2, …Run Code Online (Sandbox Code Playgroud) 我喜欢在旅途中观看我最喜欢的电视节目.我有我在播放列表中关注的每个节目的所有剧集.并非所有节目都包含相同数量的剧集.与喜欢马拉松的人不同,我喜欢将一个节目的剧集与另一个节目的剧集交错.
例如,如果我有一个名为ABC的节目有2集,而一个名为XYZ的节目有4集,我希望我的播放列表看起来像:
XYZe1.mp4
ABCe1.mp4
XYZe2.mp4
XYZe3.mp4
ABCe2.mp4
XYZe4.mp4
Run Code Online (Sandbox Code Playgroud)
生成此交错播放列表的一种方法是将每个节目表示为剧集列表,并在所有节目上执行轻快的随机播放.人们可以编写一个函数来计算每一集在单位时间间隔内的位置(0.0到1.0独占,0.0是赛季开始,1.0是赛季结束),然后根据他们的位置对所有剧集进行排序.
我在Python 2.7中编写了以下简单函数来执行in-shuffle:
def riffle_shuffle(piles_list):
scored_pile = ((((item_position + 0.5) / len(pile), len(piles_list) - pile_position), item) for pile_position, pile in enumerate(piles_list) for item_position, item in enumerate(pile))
shuffled_pile = [item for score, item in sorted(scored_pile)]
return shuffled_pile
Run Code Online (Sandbox Code Playgroud)
要获取上述示例的播放列表,我只需要调用:
riffle_shuffle([['ABCe1.mp4', 'ABCe2.mp4'], ['XYZe1.mp4', 'XYZe2.mp4', 'XYZe3.mp4', 'XYZe4.mp4']])
Run Code Online (Sandbox Code Playgroud)
这在大多数情况下都能很好地工作.但是,有些情况下结果不是最佳的 - 播放列表中的两个相邻条目是来自同一节目的剧集.例如:
>>> riffle_shuffle([['ABCe1', 'ABCe2'], ['LMNe1', 'LMNe2', 'LMNe3'], ['XYZe1', 'XYZe2', 'XYZe3', 'XYZe4', 'XYZe5']])
['XYZe1', 'LMNe1', 'ABCe1', 'XYZe2', 'XYZe3', 'LMNe2', 'XYZe4', 'ABCe2', 'LMNe3', 'XYZe5']
Run Code Online (Sandbox Code Playgroud)
请注意,有两个并排出现的'XYZ'剧集.这种情况可以简单地修复(手动交换'ABCe1'和'XYZe2').
我很想知道是否有更好的方法在不同长度的多个列表上交错或执行riffle shuffle.我想知道您是否拥有更简单,更高效或简单优雅的解决方案.
belisarius提出的解决方案(谢谢!):
import …Run Code Online (Sandbox Code Playgroud) Visual Studio中口口声声说Use of unassigned variable的iVal和iNumber.谁能告诉我哪里出错了?
这是一个代码,要求用户继续输入整数并将其添加到用户想要停止.然后在控制台上显示整数之和.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace AddFive
{
class Program
{
static void Main(string[] args)
{
int iNumber;
int iVal;
int iTotal = 0;
while (iVal > 0)
{
Console.WriteLine("Enter number " + iNumber);
iVal = Convert.ToInt32(Console.ReadLine());
iTotal = iTotal + iVal;
}
if (iNumber <= 0)
{
Console.WriteLine("Total = " + iTotal);
iVal = Convert.ToInt32(Console.ReadLine());
iTotal = iTotal + iVal;
}
Console.WriteLine("Total = " …Run Code Online (Sandbox Code Playgroud)