Tôi có một bộ
set[['booklet', '4 sheets', '48 sheets', '12 sheets']]
Sau khi phân loại, tôi muốn nó trông giống như
4 sheets,
12 sheets,
48 sheets,
booklet
Xin vui lòng bất kỳ ý tưởng nào
Silentghost
295K64 Huy hiệu vàng302 Huy hiệu bạc291 Huy hiệu Đồng64 gold badges302 silver badges291 bronze badges
Hỏi ngày 19 tháng 4 năm 2010 lúc 16:21Apr 19, 2010 at 16:21
Jeff Atwood nói về loại tự nhiên và đưa ra một ví dụ về một cách để làm điều đó trong Python. Đây là biến thể của tôi về nó:
import re
def sorted_nicely[ l ]:
""" Sort the given iterable in the way that humans expect."""
convert = lambda text: int[text] if text.isdigit[] else text
alphanum_key = lambda key: [ convert[c] for c in re.split['[[0-9]+]', key] ]
return sorted[l, key = alphanum_key]
Sử dụng như thế này:
s = set[['booklet', '4 sheets', '48 sheets', '12 sheets']]
for x in sorted_nicely[s]:
print[x]
Output:
4 sheets
12 sheets
48 sheets
booklet
Một lợi thế của phương pháp này là nó không chỉ hoạt động khi các chuỗi được phân tách bằng không gian. Nó cũng sẽ hoạt động cho các dấu phân cách khác như khoảng thời gian trong số phiên bản [ví dụ 1.9.1 xuất hiện trước 1.10.0].
Đã trả lời ngày 19 tháng 4 năm 2010 lúc 16:31Apr 19, 2010 at 16:31
Mark Byersmark ByersMark Byers
785K188 Huy hiệu vàng1552 Huy hiệu bạc1440 Huy hiệu đồng188 gold badges1552 silver badges1440 bronze badges
4
Ngắn và ngọt:
sorted[data, key=lambda item: [int[item.partition[' '][0]]
if item[0].isdigit[] else float['inf'], item]]
Phiên bản này:
- Hoạt động trong Python 2 và Python 3, bởi vì:
- Nó không cho rằng bạn so sánh các chuỗi và số nguyên [không hoạt động trong Python 3]
- Nó không sử dụng tham số
8 cho4 sheets, 12 sheets, 48 sheets, booklet
9 [không tồn tại trong Python 3]4 sheets, 12 sheets, 48 sheets, booklet
- Sẽ sắp xếp trên phần chuỗi nếu số lượng bằng nhau
Nếu bạn muốn đầu ra in chính xác như được mô tả trong ví dụ của bạn, thì:
data = set[['booklet', '4 sheets', '48 sheets', '12 sheets']]
r = sorted[data, key=lambda item: [int[item.partition[' '][0]]
if item[0].isdigit[] else float['inf'], item]]
print ',\n'.join[r]
Đã trả lời ngày 19 tháng 4 năm 2010 lúc 17:32Apr 19, 2010 at 17:32
Daniel Stutzbachdaniel StutzbachDaniel Stutzbach
71.8K17 Huy hiệu vàng85 Huy hiệu bạc76 Huy hiệu đồng17 gold badges85 silver badges76 bronze badges
3
Bạn nên kiểm tra thư viện bên thứ ba Natsort. Thuật toán của nó là chung vì vậy nó sẽ hoạt động cho hầu hết các đầu vào.
>>> import natsort
>>> your_list = set[['booklet', '4 sheets', '48 sheets', '12 sheets']]
>>> print ',\n'.join[natsort.natsorted[your_list]]
4 sheets,
12 sheets,
48 sheets,
booklet
Đã trả lời ngày 17 tháng 7 năm 2014 lúc 22:01Jul 17, 2014 at 22:01
SethmmortonsethmmortonSethMMorton
42,8K12 Huy hiệu vàng64 Huy hiệu bạc82 Huy hiệu đồng12 gold badges64 silver badges82 bronze badges
0
Một cách đơn giản là phân chia các chuỗi thành các bộ phận số và các bộ phận không phải là số và sử dụng thứ tự sắp xếp python tuple để sắp xếp các chuỗi.
import re
tokenize = re.compile[r'[\d+]|[\D+]'].findall
def natural_sortkey[string]:
return tuple[int[num] if num else alpha for num, alpha in tokenize[string]]
sorted[my_set, key=natural_sortkey]
Đã trả lời ngày 19 tháng 4 năm 2010 lúc 16:37Apr 19, 2010 at 16:37
Kiến aasManants aasmaAnts Aasma
51.6K15 Huy hiệu vàng88 Huy hiệu bạc93 Huy hiệu đồng15 gold badges88 silver badges93 bronze badges
Có ý kiến cho rằng tôi đăng lại câu trả lời này ở đây vì nó cũng hoạt động tốt cho trường hợp này
from itertools import groupby
def keyfunc[s]:
return [int[''.join[g]] if k else ''.join[g] for k, g in groupby[s, str.isdigit]]
sorted[my_list, key=keyfunc]
Thử nghiệm:
4 sheets,
12 sheets,
48 sheets,
booklet
0Đối với python3, bạn cần phải sửa đổi nó một chút [phiên bản này cũng hoạt động tốt trong python2]
4 sheets,
12 sheets,
48 sheets,
booklet
1
Đã trả lời ngày 6 tháng 6 năm 2013 lúc 7:35Jun 6, 2013 at 7:35
John La Rooyjohn La RooyJohn La Rooy
Phù bằng vàng 287K5151 gold badges359 silver badges500 bronze badges
Câu trả lời chung để sắp xếp bất kỳ số nào ở bất kỳ vị trí nào trong một loạt các chuỗi. Làm việc với Python 2 & 3.
4 sheets,
12 sheets,
48 sheets,
booklet
2Sample:
4 sheets,
12 sheets,
48 sheets,
booklet
3Một phần của câu trả lời là từ đó
Đã trả lời ngày 5 tháng 10 năm 2016 lúc 23:23Oct 5, 2016 at 23:23
Le droidle droidLe Droid
4.3242 Huy hiệu vàng34 Huy hiệu bạc32 Huy hiệu Đồng2 gold badges34 silver badges32 bronze badges
4 sheets,
12 sheets,
48 sheets,
booklet
4Đã trả lời ngày 19 tháng 4 năm 2010 lúc 16:25Apr 19, 2010 at 16:25
SilentghostsilentghostSilentGhost
295K64 Huy hiệu vàng302 Huy hiệu bạc291 Huy hiệu Đồng64 gold badges302 silver badges291 bronze badges
Dựa trên câu trả lời của SilentGhost:
4 sheets,
12 sheets,
48 sheets,
booklet
5Đã trả lời ngày 19 tháng 4 năm 2010 lúc 16:31Apr 19, 2010 at 16:31
Mark Byersmark Byers
Đã trả lời ngày 19 tháng 4 năm 2010 lúc 16:25Apr 19, 2010 at 16:25
SilentghostsilentghostRakis
Dựa trên câu trả lời của SilentGhost:23 silver badges25 bronze badges
3
Các bộ vốn không được đặt hàng. Bạn sẽ cần tạo một danh sách với cùng một nội dung và sắp xếp điều đó.
4 sheets,
12 sheets,
48 sheets,
booklet
6Rakisrakis
7.68923 Huy hiệu bạc25 Huy hiệu đồngOct 22, 2013 at 16:11
0
4 sheets,
12 sheets,
48 sheets,
booklet
7Đối với những người bị mắc kẹt với phiên bản Python trước 2.4, không có chức năng
import re
def sorted_nicely[ l ]:
""" Sort the given iterable in the way that humans expect."""
convert = lambda text: int[text] if text.isdigit[] else text
alphanum_key = lambda key: [ convert[c] for c in re.split['[[0-9]+]', key] ]
return sorted[l, key = alphanum_key]
0 tuyệt vời, một cách nhanh chóng để sắp xếp các bộ là:Apr 1, 2021 at 17:23
Điều này không trả lời câu hỏi cụ thể ở trên [
import re
def sorted_nicely[ l ]:
""" Sort the given iterable in the way that humans expect."""
convert = lambda text: int[text] if text.isdigit[] else text
alphanum_key = lambda key: [ convert[c] for c in re.split['[[0-9]+]', key] ]
return sorted[l, key = alphanum_key]
1 sẽ đến trước import re
def sorted_nicely[ l ]:
""" Sort the given iterable in the way that humans expect."""
convert = lambda text: int[text] if text.isdigit[] else text
alphanum_key = lambda key: [ convert[c] for c in re.split['[[0-9]+]', key] ]
return sorted[l, key = alphanum_key]
2], nhưng nó có thể hữu ích cho những người đến từ Google.tldrĐã trả lời ngày 22 tháng 10 năm 2013 lúc 16:113 bronze badges