使用Python 3.x,我有一个字符串列表,我想对其执行自然的字母排序.
自然排序: Windows中文件的排序顺序.
例如,以下列表是自然排序的(我想要的):
['elm0', 'elm1', 'Elm2', 'elm9', 'elm10', 'Elm11', 'Elm12', 'elm13']
Run Code Online (Sandbox Code Playgroud)
这是上面列表的"排序"版本(我有):
['Elm11', 'Elm12', 'Elm2', 'elm0', 'elm1', 'elm10', 'elm13', 'elm9']
Run Code Online (Sandbox Code Playgroud)
我正在寻找一个行为与第一个类似的排序函数.
我想知道Python中是否有类似PHP natsort函数的东西?
l = ['image1.jpg', 'image15.jpg', 'image12.jpg', 'image3.jpg']
l.sort()
Run Code Online (Sandbox Code Playgroud)
得到:
['image1.jpg', 'image12.jpg', 'image15.jpg', 'image3.jpg']
Run Code Online (Sandbox Code Playgroud)
但我想得到:
['image1.jpg', 'image3.jpg', 'image12.jpg', 'image15.jpg']
Run Code Online (Sandbox Code Playgroud)
UPDATE
解决方案基于此链接
def try_int(s):
"Convert to integer if possible."
try: return int(s)
except: return s
def natsort_key(s):
"Used internally to get a tuple by which s is sorted."
import re
return map(try_int, re.findall(r'(\d+|\D+)', s))
def natcmp(a, b):
"Natural string comparison, case sensitive."
return cmp(natsort_key(a), natsort_key(b))
def natcasecmp(a, b):
"Natural string comparison, ignores case."
return natcmp(a.lower(), b.lower())
l.sort(natcasecmp);
Run Code Online (Sandbox Code Playgroud) 习惯于对字符串进行排序的标准方法,当我注意到Windows以某种高级方式按名称对文件进行排序时,我感到很惊讶.让我给你举个例子:
Track1.mp3
Track2.mp3
Track10.mp3
Track20.mp3
我认为这些名称是根据字母和数字分别比较(在排序期间).
另一方面,以下是以标准方式排序的相同列表:
Track1.mp3
Track10.mp3
Track2.mp3
Track20.mp3
我想在Delphi中创建一个比较算法,让我以相同的方式对字符串进行排序.起初我认为比较两个字符串的连续字符就足够了.当在两个字符串的某个位置找到一个数字时,我会读取它们后面的所有数字以形成一个数字,然后比较这些数字.
举个例子,我将用这种方式比较"Track10"和"Track2"字符串:
1)读取字符时它们是相等的,而它们是字母:"Track","Track"
2)如果找到一个数字,读取以下所有数字:"10","2"
2a)如果它们相等,则转到1或者完成
Ten大于2,因此"Track10"大于"Track2"
似乎一切都会好的,直到我在测试期间发现Windows认为"Track010"低于"Track10",而我认为第一个更长,因为它更长(没有提到根据我的算法字符串将是相等的,这是错误的).
你能否告诉我Windows如何按名称对文件进行排序,或者你有一个我可以使用的即用型算法(使用任何编程语言)?
非常感谢!
马里乌什
有没有一种方法可以用来检查a raw_input是否是整数?
我在网上研究后发现了这种方法:
print isinstance(raw_input("number: ")), int)
Run Code Online (Sandbox Code Playgroud)
但是当我运行它并输入4例如,我得到FALSE.我是python的新手,任何帮助都会受到赞赏.
我希望我的程序能够以顺序格式写入文件,即:file1.txt,file2.txt,file3.txt.它只是在执行代码时编写单个文件.它不能覆盖任何现有文件,必须创建它.我很难过.
我正在读一本书来学习C++(来自python背景).我写过这个,有效:
class CatalogueItem
{
public:
CatalogueItem();
CatalogueItem(int item_code, const string &name, const string &description);
~CatalogueItem() {};
bool operator< (const CatalogueItem &other) const;
...
private:
...
};
...
list<CatalogueItem> my_list;
// this is just me playing around
CatalogueItem items[2];
items[0] = CatalogueItem(4, string("box"), string("it's a box"));
items[1] = CatalogueItem(3, string("cat"), string("it's a cat"));
my_list.push_back(items[0]);
my_list.push_back(items[1]);
my_list.sort();
Run Code Online (Sandbox Code Playgroud)
我正在尝试的部分是使用运算符<来允许列表自行排序.
这一切似乎都很好,但http://google-styleguide.googlecode.com/svn/trunk/cppguide.xml#Operator_Overloading似乎建议避免这样做,这正是本书所说的!("特别是,不要重载operator ==或operator <只是为了让你的类可以用作STL容器中的键;相反,你应该在声明容器时创建相等和比较functor类型.")
我理解"创建相等和比较函子类型"意味着创建比较函数,如下所示:
bool my_comparison_function(const CatalogueItem &a, const CatalogueItem &b)
{
// my comparison code here
}
Run Code Online (Sandbox Code Playgroud)
风格指南是指什么?
有没有人可以选择哪种方法更"正确"?
Ĵ
我在JavaScript中有一个包含以下内容的数组:
我将如何排序此数组,使其不显示如下:
但是:
任何帮助都会很棒.
我用f.listFiles()在目录中创建了一个文件列表.
不幸的是,它们的名称如下:
001.pdf
098.pdf
100.pdf
1000.pdf
现在,目录中的文件数组在100.pdf之前设置了1000.pdf.
如何对此进行排序以使文件以正确的顺序返回?
感谢帮助!
我正在尝试对IP地址进行排序,我将其读入python脚本并打印出来.我起草的代码读取并打印文件的内容(参见示例)
#!/usr/bin/python
f = open('file.txt', 'r')
file_contents = f.read()
print (file_contents)
f.close()
Run Code Online (Sandbox Code Playgroud)
我的问题是如何进行IP地址导入并正确排序?在命令行,我通常会通过一个简单的排序命令传递文件(sort -n -t.-k 1,1 -k 2,2 -k 3,3 -k 4,4).但是我如何让python对它从文件中读取的IP进行排序,以便输出正确排序,同时考虑到IP的每个八位字节的0-255编号模式?
谢谢,
sorting ×7
python ×5
algorithm ×2
numbers ×2
string ×2
arrays ×1
c ×1
c++ ×1
filesystems ×1
integer ×1
java ×1
javascript ×1
natsort ×1
natural-sort ×1
python-2.7 ×1
python-3.x ×1
raw-input ×1
syntax ×1
text ×1